Почему установка переменной, равной другой переменной, что-либо меняет в этом коде?

У меня есть некоторые проблемы со следующим кодом (Python):

x = [0,0]
y = [[1,1],[2,2],[3,3]]
z = y
# z = [[1,1],[2,2],[3,3]]

print(y)
for i in range(0,len(z)):
    if i == 0:
        z[i] = x
    else:
        z[i] = y[i-1]
print(y)

y = z

print(y)
for i in range(0,len(z)):
    if i == 0:
        z[i] = x
    else:
        z[i] = y[i-1]
print(y)

Что я ожидаю, так как на выходе

[[1, 1], [2, 2], [3, 3]]
[[1, 1], [2, 2], [3, 3]]
[[0, 0], [1, 1], [2, 2]]
[[0, 0], [1, 1], [2, 2]]

но то, что я получаю

[[1, 1], [2, 2], [3, 3]]
[[0, 0], [0, 0], [0, 0]]
[[0, 0], [0, 0], [0, 0]]
[[0, 0], [0, 0], [0, 0]]

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

[[1, 1], [2, 2], [3, 3]]
[[1, 1], [2, 2], [3, 3]]
[[0, 0], [1, 1], [2, 2]]
[[0, 0], [0, 0], [0, 0]]

Почему строки 1 и 2 и 3 и 4 выходных данных не всегда одинаковы? Насколько я могу судить, я не делаю ничего, чтобы изменить y (кроме y=z), и я не понимаю, почему использование z=y или z = [...] в начале имеет значение.

2 ответа

Решение

Так как z = y наборы z указать на тот же объект, что и y указывает на. Если потом пишешь z = [[1,1],[2,2],[3,3]], z больше не указывает на тот же объект, что и y, он указывает на другой объект, который имеет те же значения.

Изменить эту строку z = y в

from copy import deepcopy 

z = deepcopy(y)

Ваш код будет работать нормально.

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