【发布时间】:2017-10-14 11:58:54
【问题描述】:
也许我不明白浅拷贝的定义……但我很困惑:
来自文档:
其中“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
都是单独的 对象。我错过了什么?
【问题讨论】:
-
...如果我将 l1 更改为数字列表列表,我仍然会得到相同的结果 - l1.copy() 似乎创建了一个单独的对象
-
没有。这些都是浅拷贝。该问题的区别在于单纯的分配(根本不复制)和复制(浅的)
-
@juanpa.arrivillaga, Ahhhh 好的,我明白了。
-
@RSHAP 你可以用
is
测试深度相等,用==
测试浅相等。在这里,深层平等意味着浅层平等。 (l1 is l2
仅是True
,如果两个引用都指向同一个对象,而l1 == l2
是True
,当l1
和l2
的所有值都相等时)
标签: python list deep-copy shallow-copy