我想制作一个列表的副本(字面上是一个与原始文件没有任何共享的独立克隆)。我使用了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 [:]
时也会发生这种情况谢谢!
答案 0 :(得分:2)
友善的狗 在OP下发表评论并建议我使用deepcopy()。有用。谢谢!
答案 1 :(得分:2)
你应该在那里使用deepcopy(),因为copy()使得你引用的对象的浅层克隆不是其中的对象。如果你想要整个对象(其中包含对象),请使用deepcopy()。
请参阅链接以便更好地理解
What is the difference between a deep copy and a shallow copy?
答案 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