Я видел этот Python сниппет на Twitter и весьма смущены выход:Python Оператор присваивания старшинства - (а, Ь) = а [Ь] = {}, 5
>>> a, b = a[b] = {}, 5
>>> a
{5: ({...}, 5)}
Что здесь происходит ?
Я видел этот Python сниппет на Twitter и весьма смущены выход:Python Оператор присваивания старшинства - (а, Ь) = а [Ь] = {}, 5
>>> a, b = a[b] = {}, 5
>>> a
{5: ({...}, 5)}
Что здесь происходит ?
Из 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
Хм, что удивительно неинтуитивными для Python! Я бы ожидал, что он будет каскадом справа налево и, таким образом, выбросит 'NameError', с помощью' a [b] = a, b = {}, 5' работы. – Claudiu
Отличный ответ. Я выяснил, что происходило до того, как я опубликовал и планировал опубликовать ответ, но вы очень хорошо ответили ему. Кроме того, +1 для 'a [b] [0] является линией. – Andrew
Хороший ответ! Но документы говорят, что _ присваивает ** единственный результирующий объект ** каждому из целевых списков слева направо, поэтому он не должен быть эквивалентен 'a, b = {}, 5; a [b] = {}, 5'? –