Skip to main content
 首页 » 编程设计

Python之copy.copy() 的元素是否仍与原始元素共享内存

2025年05月04日24落叶无声

我想制作一个列表的副本(字面意思是一个单独的克隆,与原始列表没有任何共享)。我使用了 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?

https://docs.python.org/2/library/copy.html