Python 当其他变量改变时,浅拷贝不会自动改变变量

Python shallow copy doesn't automatically change the variable when the other variable is changed

我有一段代码应该使用浅拷贝来自动改变变量:pos_x和pos_y,当pos改变时。

import copy
class AClass:
    def __init__(self):
        self.pos = [1, 2]
        self.pos_x = copy.copy(self.pos[0])
        self.pos_y = copy.copy(self.pos[1])


temp = AClass()
temp.pos[0] = 5
print(temp.pos_x)

为什么输出 1 而不是 5?

事件的顺序是:

  1. 创建了 temp,其中涉及将 temp.pos 的元素副本分配给 temp.pos_xtemp.pos_y
  2. 替换temp.pos的值。
  3. 打印temp.pos_x的值。

那些代码中 没有任何内容 导致 pos_xpos_ypos 更改时更改。

因为你的代码所做的并不是你认为的那样。列表的浅表副本将创建一个新列表并添加对其中对象的引用。

问题是您拥有的两个元素(它们是数字)的引用是对不可变对象 1 和 2 的引用,而不是对列表中特定对象 1 和 2 的引用。您可以使用 id:

检查
temp = AClass()
id(temp.pos[0])
id(1)

ID 相同,这意味着您的 temp.pos[0] 指向 "global" 1.

如果你真的想做一些你想做的事情而不需要大的改变(比如使用方法来改变 pos),它必须是这样的:

import copy
class AClass:
    def __init__(self):
        self.pos = [[[1]], [[2]]]
        self.pos_x = copy.copy(self.pos[0])
        self.pos_y = copy.copy(self.pos[1])

然后,复制将创建一个新列表,并在其中插入对列表的引用和 1。改变 t[0][0][0] 也会改变 x[0][0]。但这可能远不是一个好的方法。同样,您可以验证 t[0][0] 和 x[0] 的 id 是否相同,因此它们都指向同一个列表。