2015-08-20 5 views

ответ

17

Из Assignment statements documentation: оператор присваивания

оценивает список выражений (помните, что это может быть одно выражение или список разделенных запятыми, последний получая кортеж) и присваивает единый результирующий объект каждый из целевых списков слева направо.

У вас есть два целевых списка назначения; a, b и a[b], значение {}, 5 присваивается этим двум целям слева направо.

Первый {}, 5 tuple распакован до a, b. Теперь у вас есть a = {} и b = 5. Обратите внимание, что {} изменен.

Далее присвоить этот словарь и целое число a[b], где a оценивающий словарь, и b оценивающих к 5, так что вы настраиваете в словаре ключ 5 для кортежа ({}, 5) создания циклической ссылки. Таким образом, {...} ссылается на тот же объект, на который уже ссылается a.

Поскольку назначение происходит слева направо, вы можете разбить это вниз:

a, b = {}, 5 
a[b] = a, b 

так a[b][0] тот же объект, как a:

>>> a, b = {}, 5 
>>> a[b] = a, b 
>>> a 
{5: ({...}, 5)} 
>>> a[b][0] is a 
True 
+4

Хм, что удивительно неинтуитивными для Python! Я бы ожидал, что он будет каскадом справа налево и, таким образом, выбросит 'NameError', с помощью' a [b] = a, b = {}, 5' работы. – Claudiu

+0

Отличный ответ. Я выяснил, что происходило до того, как я опубликовал и планировал опубликовать ответ, но вы очень хорошо ответили ему. Кроме того, +1 для 'a [b] [0] является линией. – Andrew

+0

Хороший ответ! Но документы говорят, что _ присваивает ** единственный результирующий объект ** каждому из целевых списков слева направо, поэтому он не должен быть эквивалентен 'a, b = {}, 5; a [b] = {}, 5'? –

Смежные вопросы