2017-05-15 11 views
0

ディープコピー対浅いlist.copyのpythonは、たぶん私は浅いコピーの定義を理解していない...しかし、私は非常に混乱してい

「s」がある場合はリスト(しかし、同じ質問が辞書にそれぞれ適用されます)。

"s.copy()|(Sのと同じ[:])Sの簡易コピーを作成します"

私はs[:]が深いコピーだと思った場合を除き。たとえば、リストをコピーする方法については、this stack overflow answerを参照してください(元のバージョンを指すだけではありません)。 [:]

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] 

l1l2、およびl3はすべて別々オブジェクトであるように思われるとlist1.copy()を使用することだけでなく、別名同じ動作をディープコピーを行うようです。私は何が欠けていますか?

+0

...もしl1を数字のリストのリストに変更しても、同じことが起こります - l1.copy()は別のオブジェクトを作成するようです – RSHAP

+1

いいえ、どちらも浅いコピーです。その質問の区別は単なる割り当て(全くコピーしない)とコピー(浅いもの)の間にある –

+0

@ juanpa.arrivillaga、ああ、これは答えているよ。 – 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) 

ディープコピーがリストの新しい(ディープコピー)を作成だけではなく上にコピーするためです古いリストへの参照。

関連する問題