Python; привязки имен не являются ссылками на объекты?

Я пытаюсь понять, что такое привязка имени Python, и когда эта привязка интерпретируется.

В с,

include <stdio.h>
int main()
{
int X = 42;
int* Y[1];
Y[0] = &X;
X = 666;
printf("%d", *Y[0]);
return 0;
}

печатает 666. Я ожидал блок кода Python:

X = 42
L = []
L.append(X) #3
X = 666
print(L) #5

сделать то же самое, но это не так. Что именно происходит между линиями, помеченными 3 и 5? Делает ли #3 еще одну ссылку на объект, известный как "42", например X, давайте назовем его X'и сохраняем X' в объекте, на который указывает L, который является []?

1 ответ

Решение

То, что вы заявляете, почти то, что происходит:

X = 42               # Create new object 42, bind name X to it.
L = []
L.append(X)          # Bind L[0] to the 42 object.
X = 666              # Create new object 666, bind name X to it.
print(L)             # Will not see the 666.

append не привязывает элемент массива к X, это связывает его с объектом позади X, который является 42,

Когда я впервые осознал, что именно так работает Python, вещи (особенно такие вещи, которые ранее смущали меня и вызывали сильную тоску и скрежет зубов) стали намного яснее.

Другие вопросы по тегам