Leave a comment

Comments 6

vitus_wagner April 6 2012, 11:26:12 UTC
Что самое прикольное - в любой версии питона от 2.3.4 до 3.1.3 - неизменно превосходный результат.

Reply

gegmopo4 April 6 2012, 12:30:42 UTC
«Это не баг, а фича».

Reply

steel_monster April 6 2012, 19:41:11 UTC
В С/С++ примерно та же фигня с константными указателями/ссылками. "Если нельзя, но очень хочется, то - можно" (с)

Reply

gegmopo4 April 6 2012, 20:29:57 UTC
Нет, в C/C++ совсем не такая фигня. Для кого-то, конечно, и ссылки gotcha, это субъективно. А здесь очень похоже на баг. Хотя пример этот давно известен, багов такого типа в Питоне не следует ожидать, наверняка есть какие-то разумные объяснения, но я их не могу придумать.

Reply


_winnie April 6 2012, 22:21:58 UTC
я думал, что в python x+=y должно быть точным аналогом x = x+y , включая эффекты identity ссылок. Удивлён, что это не так для списков. Ну, видимо тут Гвидо не выспался, и решил что оптимизация "изменяем переменную а не создаём новую" привычная для сишников должна быть и тут, несмотря на общую политику "x+=y это x+y"

>>> a = [1]
>>>id(a)
19859496

>>> a += [3]
>>> id(a)
19859496

Reply

gegmopo4 April 7 2012, 05:50:58 UTC
Иначе += для коллекций был бы слишком дорогим. identity может иногда сохраняться и при x = x + y, это тоже не удивительно.

Но gotcha не в этом.

x += y в Питоне это x = x.__iadd__(y), x = x.__add__(y) или x = y.__radd__(x). И такая схема fallbacks удобнее C++, где нужно определять всё.

Из этого определения и становится ясным результат.

Reply


Leave a comment

Up