python list.copy浅与深拷贝

时间:2017-05-15 15:53:58

标签: python list deep-copy shallow-copy

也许我不理解浅拷贝的定义......但我很困惑:

来自文档:

哪里" s"是一个列表(但同样的问题分别适用于字典)。

  

" s.copy()|创建s的浅表副本(与s [:]相同)"

除了我认为s[:]是一份很深的副本。例如,请参阅this stack overflow answer有关如何复制列表的信息(不指向原始版本)。并且使用list1.copy()似乎也执行深度复制以及与[:]

相同的行为
l1 = [1,2,3,4]
l2 = l1[:]
l3 = l1.copy()



l2.append(5)
l3[0] = 99
print(l1)
print(l2)
print(l3)
>> [1,2,3,4]
>> [1,2,3,4,5]
>> [99,2,3,4]

l1l2l3似乎都是单独的对象。我错过了什么?

2 个答案:

答案 0 :(得分:2)

你只是误解了在这种背景下“浅”和“深”的含义。

浅拷贝只是顶级元素的副本。如果这些元素中的任何一个本身是列表,则副本仍将引用原始列表。这是l1[:]l1.copy()所做的。

深层复制是所有级别的副本。如果任何元素是列表,它们也将被深度复制。不会分享任何参考。这就是copy.deepcopy()的作用。

答案 1 :(得分:0)

浅表副本意味着新列表包含对旧列表所具有的同一对象的引用。

例如:

foo = [1, 2, []]
bar = foo.copy()
bar[-1].append(3)
print(foo)

我们会看到bar中对象的突变也“污染”foo

如果我们使用深层副本重新执行此示例,则它是一个不同的故事:

import copy
foo = [1, 2, []]
bar = copy.deepcopy(foo)
bar[-1].append(3)
print(foo)

这是因为深层复制会创建列表的新(深层副本),而不是仅仅复制对旧列表的引用。