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

问题描述 投票:2回答:2

这个问题在这里已有答案:

我遇到以下代码(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 = [...]会产生影响。

python list variable-assignment godot
2个回答
2
投票

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


2
投票

将此行z = y更改为

from copy import deepcopy 

z = deepcopy(y)

您的代码将正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.