Подтвердить что ты не робот

Приоритет оператора присваивания Python - (a, b) = a [b] = {}, 5

Я видел этот фрагмент Python на Twitter и был довольно смущен выходом:

>>> a, b = a[b] = {}, 5
>>> a
{5: ({...}, 5)}

Что здесь происходит?

4b9b3361

Ответ 1

В документации Отчеты о назначениях:

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

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

Сначала кортеж {}, 5 распаковывается на 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