Почему установка переменной, равной другой переменной, что-либо меняет в этом коде?
У меня есть некоторые проблемы со следующим кодом (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)
Ваш код будет работать нормально.