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?
事件的顺序是:
- 创建了
temp
,其中涉及将 temp.pos
的元素副本分配给 temp.pos_x
和 temp.pos_y
。
- 替换
temp.pos
的值。
- 打印
temp.pos_x
的值。
那些代码中 没有任何内容 导致 pos_x
或 pos_y
在 pos
更改时更改。
因为你的代码所做的并不是你认为的那样。列表的浅表副本将创建一个新列表并添加对其中对象的引用。
问题是您拥有的两个元素(它们是数字)的引用是对不可变对象 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 是否相同,因此它们都指向同一个列表。
我有一段代码应该使用浅拷贝来自动改变变量: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?
事件的顺序是:
- 创建了
temp
,其中涉及将temp.pos
的元素副本分配给temp.pos_x
和temp.pos_y
。 - 替换
temp.pos
的值。 - 打印
temp.pos_x
的值。
那些代码中 没有任何内容 导致 pos_x
或 pos_y
在 pos
更改时更改。
因为你的代码所做的并不是你认为的那样。列表的浅表副本将创建一个新列表并添加对其中对象的引用。
问题是您拥有的两个元素(它们是数字)的引用是对不可变对象 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 是否相同,因此它们都指向同一个列表。