Pythonにコピー(ディープコピーとシャローコピー)

| | | |

あるコピーを別のコピーを変更せずに変更できるようにするために、コピーが必要になる場合があります。 Pythonには、コピーを作成する2つの方法があります。

  • ディープコピー
  • 浅いコピー

これらのコピーを作成するには、を使用します。 モジュールをコピーします。浅いコピー操作と深いコピー操作には、 copyモジュールを使用します。例


#import copy module

import コピー


#リスト1を初期化

li1 = [ 1 2 、[ 3 5 ]、 4 ]


#浅いコピーにはコピーを使用

li2 = co py.copy( li1)


#DeepcopyforDeepcopyの使用

li3 <コードクラス="ke yword "> = copy.deepcopy(li1)

上記のコードでは、 copy()はリストの浅いコピーを返し、 deepcopy()はリストの深いコピーを返します。

deepcopy

ディープコピー&#8212;これは、コピープロセスが再帰的に発生するプロセスです。これは、最初に新しいコレクションオブジェクトを作成し、次に元のオブジェクトにある子オブジェクトのコピーを再帰的に入力することを意味します。ディープコピーの場合、オブジェクトのコピーが別のオブジェクトにコピーされます。これは、オブジェクトのコピーに加えられた変更が元のオブジェクトに反映されないことを意味します。 Pythonでは、これは deepcopy()関数を使用して行われます。


#コピー操作を示すPythonコード


#import&quot;コピー&quot;コピー操作の場合

import コピー


#リスト1を初期化しています

li1 = [ 1 2 、[ 3 5 ]、 4 ]


#ディープコピーを使用してディープコピーする

li2 = copy.deepcopy(li1)


#元のリストアイテム

print "ディープコピー前の元の要素"

for i in range 0 len (li1)):

print (li1 [i]、end = ""

print ""


#新しいリストにアイテムを追加

li2 [ 2 ] [ 0 ] = 7


#変更はl2に反映されます

print "ディープコピー後の要素の新しいリスト"

for i in range 0 len (li1)):

print (li2 [i]、end = ""


p rint ""


#変更は元のリストには反映されません
#ディープコピーのように

print "ディープコピー後の元の要素"

for i in 範囲 0 len (li1)):

印刷(li1 [i]、end = " "

終了:

元の要素■ディープコピー前12[3、5]4ディープコピー後の新しい要素リスト12 [7、5]4ディープコピー後の元の要素12 [3、5] 4 

In上記の例では、リストに加えられた変更は他のリストに影響を与えず、深いコピーリストを示しています。

浅いコピー

浅いコピーとは、新しいコレクションオブジェクトを作成し、見つかった子オブジェクトへの参照をそのオブジェクトに追加することを意味しますオリジナルで。コピープロセスは繰り返されないため、子オブジェクト自体のコピーは作成されません。浅いコピーの場合、オブジェクトへの参照は別のオブジェクトにコピーされます。これは、オブジェクトのコピーに加えられた変更が元のオブジェクトに反映されることを意味します。Pythonは、「 copy()」関数を使用してこれを行います。


#コピー操作を示すPythonコード


#インポート&quot;コピー&quot;コピー操作の場合

import コピー


#リスト1を初期化しています

li1 = [ 1 2 、[ 3 5 ]、 4 ]


#浅いコピーにはコピーを使用

li2 = copy.copy(li1)


#元のリストアイテム

print "浅いコピー前の元の要素"

for i in range 0 len (li1)):

print (li1 [i]、end = ""


print ""


#新しいリストにアイテムを追加

li2 [ 2 ] [ 0 ] = 7


#変更が反映されているかどうかを確認します

印刷 "浅いコピー後の元の要素"

for i in 範囲 0 len (li1 )):

print (li1 [i]、end = " "

終了:

浅いコピーの前の元の要素1 2 [3、5]4浅いコピー後の元の要素12 [7、5] 4 

上記の例では、リストに加えられた変更はは別のリストで有効になり、リストがコピーされたことを示します。

重要なポイント:
浅いコピーと深いコピーの違いは、複合オブジェクト(を含むオブジェクト)にのみ適用されます。リストやクラスインスタンスなどの他のオブジェクト):

  • 浅いコピーは新しい複合オブジェクトを作成し、(可能な限り)元のオブジェクトで見つかったオブジェクトへの参照を挿入します。
  • ディープコピーは、新しい複合オブジェクトを作成し、元のオブジェクトで見つかったオブジェクトのコピーを再帰的に挿入します。