Ответ 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