Несколько заданий в 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
ввел бесконечный цикл с саморегуляцией.