Несколько заданий в python

Мне нужно объяснение здесь. Почему работает следующий код?

foo1 = foo1[0] = [0]

Хорошо, я знаю, что задания выполняются слева направо.

Как python понимает foo1 список?

Btw Я знаю, что foo1 заканчивается как [[...]] его первый элемент сам.

Ответ 1

Так как

foo1 = foo1[0] = [0]

эквивалентно

temp = [0]
foo1 = temp 
foo1[0] = temp 

он сначала оценивает выражение, а затем назначает слева направо. Анализируя эту строку за строкой, вы получите то, что происходит: - сначала список создается в temp - тогда список temp присваивается foo1 что делает его списком (отвечает на ваш реальный вопрос) - 3-я строка только делает назначение первого элемента сам список (при этом [[...]] на выходе)

Обновление 2: изменение связанного вопроса в соответствии с комментарием @blhsing к более смежному обсуждению: Python Несколько заявлений присваивания в одной строке

Ответ 2

Python-переменные знают свои типы на основе типа переменной, назначенной ему. Это динамически тип языка. В вашем коде интерпретатор видит foo1 = foo1[0] = [0] и он заканчивает значение в конце, которое равно [0]. Это список с одним элементом 0. Теперь это присваивается первому элементу списка foo1 через foo1[0] = [0]. Но так как foo1 уже объявлен, он создает объект, который имеет указатель на себя, и, следовательно, foo1 получает саморегуляцию бесконечно, причем самый внутренний список имеет 0.

Структура списка foo1 будет одинаковой, если код foo1 = foo1[0].

Объект foo1 ввел бесконечный цикл с саморегуляцией.