为什么将一个变量设置为等于另一个变量会改变此代码中的任何内容?

Why does setting a variable equal to another variable change anything in this code?

我在使用以下代码 (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]]

当我改用我为 z 注释掉的行时,我得到

[[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 = [...] 会有所不同。

将此行 z = y 更改为

from copy import deepcopy 

z = deepcopy(y)

您的代码可以正常工作。

因为 z = y 设置 z 指向与 y 指向相同的对象。如果您随后写入 z = [[1,1],[2,2],[3,3]]z 不再指向与 y 相同的对象,它指向具有相同值的不同对象。