Оператор присваивания оценивает список выражений (помните, что это может быть одно выражение или список, разделенный запятыми, последний из которых имеет кортеж) и присваивает единственный результирующий объект каждому из целевых списков слева направо.
У вас есть два целевых списка назначения; 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