也许我不理解浅拷贝的定义......但我很困惑:
来自文档:
哪里" 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]
l1
,l2
和l3
似乎都是单独的对象。我错过了什么?
答案 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)
这是因为深层复制会创建列表的新(深层副本),而不是仅仅复制对旧列表的引用。