我想制作一个列表的副本(字面意思是一个单独的克隆,与原始列表没有任何共享)。我使用了 copy.copy() 并创建了 2 个单独的列表,但为什么每个副本的元素似乎仍然共享?
这很难解释,请查看以下输出。
>>> a = [[0,1], [2,3]]
>>> import copy
>>> b = copy.copy(a)
>>> temp = b.pop()
>>> temp
[2, 3]
>>> a
[[0, 1], [2, 3]]
>>> b
[[0, 1]]
>>> temp.append(4)
>>> temp
[2, 3, 4]
>>> a
[[0, 1], [2, 3, 4]]
>>> b
[[0, 1]]
如您所见,temp 是从 b 中弹出的,但是当我更改 temp(也就是添加新内容)时,temp 中的数据strong>a 也发生了变化。
我的问题是:这是 deepcopy 的预期行为吗?那么我怎样才能制作一份完全独立的列表副本呢?
P/S:如上例,我想我可以做到
temp = copy.copy(b.pop())
但这是正确的方法吗?有没有其他方法可以做我想做的事?
P/S 2:当我使用 b = a[:] 时也会发生这种情况
谢谢!
请您参考如下方法:
您应该在那里使用 deepcopy(),因为 copy() 对您引用的对象进行浅克隆,而不是其中的对象。如果您想要整个对象(以及其中的对象),请改用 deepcopy()。
请引用链接以获得更好的理解
What is the difference between a deep copy and a shallow copy?
