2017-05-15 16 views
0

也許我不明白的淺拷貝的定義...但我很困惑:蟒蛇list.copy淺VS深拷貝

從文檔:

其中「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都是獨立對象。我錯過了什麼?

+0

......如果我改變L1至號碼清單列表我仍然得到同樣的事情 - l1.copy()似乎創建一個單獨的對象 – RSHAP

+1

號這些都是淺拷貝。在這個問題上的區別是單純的任務(根本不復制)和複製(淺層次)之間的差別。 –

+0

@ juanpa.arrivillaga,Ahhhh好的,我看到這個答案。 – RSHAP

回答

0

在這種情況下,您只是誤解了「淺」和「深」的含義。

淺拷貝只是元素頂層的副本。如果這些元素中的任何一個都是自己的列表,這些副本仍然會引用原始列表。這是l1[:]l1.copy()都做的。

深層副本是所有級別的副本。如果任何元素是列表,它們也將被深度複製。將不會分享任何參考。這是copy.deepcopy()所做的。

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) 

這是因爲深拷貝創建列表的新(深拷貝),而不僅僅是複製過參考舊名單。