2

Pythonのディープコピーとシャローコピーについて質問です。

ディープ コピーとシャロー コピーの違いは何ですか?

私を助けることはできません。

なぜ例えば 1 の合計は 10 ではなく 6 なのですか?

例1:

kvps = { '1' : 1, '2' : 2 }
theCopy = kvps.copy()  # both point to the same mem location ? 
kvps['1'] = 5
sum = kvps['1'] + theCopy['1']
print sum

出力合計は 6

例2:

aList = [1,2]
bList = [3,4]
kvps = { '1' : aList, '2' : bList }

theCopy = kvps.copy()  # both point to the same mem location ? 
kvps['1'][0] = 5
sum = kvps['1'][0] + theCopy['1'][0]

print sum

出力合計は 10

例3:

import copy

aList = [1,2]
bList = [3,4]
kvps = { '1' : aList, '2' : bList }

theCopy = copy.deepcopy(kvps)
kvps['1'][0] = 5
sum = kvps['1'][0] + theCopy['1'][0]

print sum

出力合計は 6 です。

また、例えば 4

kvps = { '1' : 1, '2' : 2 }    
theCopy = dict(kvps)  #  theCopy hold a reference to kvps ?     
kvps['1'] = 5  # should also change theCopy , right ?    
sum = kvps['1'] + theCopy['1']    
print kvps    
print theCopy    
print sum

その合計は 6 です。 theCopy が kvps への参照である場合、それは 10 になります。

4

2 に答える 2

6

浅いコピーは、最上位コンテナ内の可変オブジェクトのコピーを作成します。ディープコピーは、データ構造内のすべての可変コンテナの新しいインスタンスを作成します。

「eg2」は、外側のdictをコピーするため、10になりますが、内側の2つのリストは古いリストのままであり、リストはその場で変更できます(変更可能です)。

ディープコピーはaList.copy()、bList.copy()を実行し、dictの値をそれらのコピーに置き換えます。


例1の説明:

kvps = {'1': 1, '2': 2}
theCopy = kvps.copy()

# the above is equivalent to:
kvps = {'1': 1, '2': 2}
theCopy = {'1': 1, '2': 2}

これを例2に適用すると:

kvps = {'1': aList, '2': bList}
theCopy = {'1': aList, '2': bList}

両方のdictのリストオブジェクトは同じオブジェクトであるため、リストの1つを変更すると両方のdictに反映されます。


ディープコピー(例:3)を実行すると、次のようになります。

kvps = {'1': aList, '2': bList}
theCopy = {'1': [1, 2], '2': [3, 4]}

これは、両方のdictの内容が完全に異なり、一方を変更しても他方は変更されないことを意味します。


たとえば、4ビアdict()は浅いコピーに相当します。

于 2012-01-27T19:13:06.913 に答える
1

eg1
この例では、キーのコピーを作成しますが、それらが指すオブジェクトは作成しません。1 つのキーが指すものを変更しても、そのキーのコピーは変更されません。これは、キーのコピーがメモリ内の別の場所に存在し、再割り当てされるまで同じオブジェクトのみを指すためです。コピーの 1 つを再割り当てしても、もう一方は変更されないため、6 が得られます。

eg2
キーがコピーされます。どちらのキーも同じオブジェクトを指しています。割り当ては、両方のキーが指すオブジェクトを変更します (ただし、両方のキーはメモリ内の異なる場所にあります)。これが、合計で両方の変更が見られる理由です。

eg3
すべてがコピーされます。各キーは、オブジェクトの独自のコピーを指します。現在、メモリには 2 つの「aList」があります。KVPS が指す aList は変更されますが、COPY が指す「aList」は変更されません。

http://docs.python.org/library/copy.html

于 2012-01-27T19:35:52.097 に答える