Gotcha

Apr. 6th, 2012 12:51 pm
gegmopo4: (Default)
[personal profile] gegmopo4

Блиц из трёх вопросов.

  1. Код на Питоне:

    a = ([1], 2)
    a[0] = [3]

    Чему теперь равно a?

  2. Код на Питоне:

    a = ([1], 2)
    b = a[0]
    b += [3]

    Чему теперь равно a?

  3. Код на Питоне:

    a = ([1], 2)
    a[0] += [3]

    Чему теперь равно a?

P. S. x += y в Питоне это x = x.__iadd__(y), x = x.__add__(y) или x = y.__radd__(x), в зависимости от того, что определено и подходит. Из этого определения становится ясным на первый взгляд странный результат.

Date: 2012-04-06 11:26 am (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner
Что самое прикольное - в любой версии питона от 2.3.4 до 3.1.3 - неизменно превосходный результат.

Date: 2012-04-06 12:30 pm (UTC)
ext_605364: geg MOPO4 (Default)
From: [identity profile] gegmopo4.livejournal.com
«Это не баг, а фича».

Date: 2012-04-06 07:41 pm (UTC)
From: [identity profile] steel-monster.livejournal.com
В С/С++ примерно та же фигня с константными указателями/ссылками. "Если нельзя, но очень хочется, то - можно" (с)

Date: 2012-04-06 08:29 pm (UTC)
ext_605364: geg MOPO4 (Default)
From: [identity profile] gegmopo4.livejournal.com
Нет, в C/C++ совсем не такая фигня. Для кого-то, конечно, и ссылки gotcha, это субъективно. А здесь очень похоже на баг. Хотя пример этот давно известен, багов такого типа в Питоне не следует ожидать, наверняка есть какие-то разумные объяснения, но я их не могу придумать.

Date: 2012-04-06 10:21 pm (UTC)
From: [identity profile] http://users.livejournal.com/_winnie/
я думал, что в python x+=y должно быть точным аналогом x = x+y , включая эффекты identity ссылок. Удивлён, что это не так для списков. Ну, видимо тут Гвидо не выспался, и решил что оптимизация "изменяем переменную а не создаём новую" привычная для сишников должна быть и тут, несмотря на общую политику "x+=y это x+y"

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

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

Date: 2012-04-07 05:50 am (UTC)
ext_605364: geg MOPO4 (Default)
From: [identity profile] gegmopo4.livejournal.com
Иначе += для коллекций был бы слишком дорогим. identity может иногда сохраняться и при x = x + y, это тоже не удивительно.

Но gotcha не в этом.

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

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

Profile

gegmopo4: (Default)
gegmopo4

May 2015

S M T W T F S
     12
3456789
10111213141516
17181920212223
24252627282930
31      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 18th, 2017 04:14 pm
Powered by Dreamwidth Studios