为啥设置一个变量等于另一个变量会改变这段代码中的任何内容? [复制]

Posted

技术标签:

【中文标题】为啥设置一个变量等于另一个变量会改变这段代码中的任何内容? [复制]【英文标题】:Why does setting a variable equal to another variable change anything in this code? [duplicate]为什么设置一个变量等于另一个变量会改变这段代码中的任何内容? [复制] 【发布时间】:2019-07-14 03:18:39 【问题描述】:

我在使用以下代码 (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 = [...] 会有所不同。

【问题讨论】:

【参考方案1】:

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

【讨论】:

为什么这会改变我输出的第二行?我可能只是不理解一些简单的东西,但不管z 是什么,我第一次和第二次打印它时y 不应该相同吗? yz 是同一个东西,但名称不同。如果您更改zy 也会更改【参考方案2】:

将此行z = y 更改为

from copy import deepcopy 

z = deepcopy(y)

您的代码可以正常工作。

【讨论】:

我最初在 GDscript 中遇到了问题,并改用 Python 将其发布在这里,因为我认为我更有可能通过这种方式获得帮助。我更想知道为什么我首先会遇到问题,而不是仅仅解决问题。 @user44557 我正在编辑我的答案以获得更多说明,但问题已关闭,在***.com/questions/2612802/how-to-clone-or-copy-a-list 中您可以更好地找到答案。问题肯定是把一个列表分配给另一个变量,如果你改变一个,另一个也会改变。

以上是关于为啥设置一个变量等于另一个变量会改变这段代码中的任何内容? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用类变量的这段代码不能像在 Java 中那样工作? [复制]

为啥这段代码会导致编译器在 Xcode 中报告“未使用的变量”

为啥返回变量的值会改变?

将函数输入的默认值设置为等于 Python 中的另一个输入

为啥为了Java改变环境变量后不能运行CMD中的命令

如何将 DEFINE 变量设置为等于 PL/SQL 中另一个已定义表的选择