Python - copy.copy()的元素仍然与原始内容共享内存?

时间:2016-09-01 04:54:36

标签: python copy

我想制作一个列表的副本(字面上是一个与原始文件没有任何共享的独立克隆)。我使用了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 (又称添加新内容)时,中的数据< strong> a 也发生了变化。

我的问题是:这是一种预期的深度镜检查行为吗?那么如何制作完全独立的列表副本呢?

P / S:如上例所示,我想我可以做到 temp = copy.copy(b.pop())
但这是一个正确的方法吗?还有其他办法可以做我想要的吗?

P / S 2:当我使用b = a [:]

时也会发生这种情况

谢谢!

3 个答案:

答案 0 :(得分:2)

友善的狗 在OP下发表评论并建议我使用deepcopy()。有用。谢谢!

答案 1 :(得分:2)

你应该在那里使用deepcopy(),因为copy()使得你引用的对象的浅层克隆不是其中的对象。如果你想要整个对象(其中包含对象),请使用deepcopy()。

请参阅链接以便更好地理解

What is the difference between a deep copy and a shallow copy?

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

答案 2 :(得分:1)

The copy.copy() was shallow copy. That means, it would create a new object as same as be copied. but the elements within copied object didn't be created, and them also is a reference. -> a = [[0,1], [2,3]] -> import copy -> b = copy.copy(a) # the b be created, but [0,1] [2,3] still are reference -> 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]] Docs