Articles

Pythonシャローコピーとディープコピー

Pythonでオブジェクトをコピー

Pythonでは、=演算子を使用してオブジェクトのコピーを作成します。 それは元のオブジェクトの参照を共有する新しい変数を作成するだけです。

old_listという名前のリストを作成し、=演算子を使用してnew_listにオブジェクト参照を渡す例を見てみましょう。,

例1:=演算子を使用してコピー

上記のプログラムを実行すると、出力は次のようになります。

Old List: , , ]ID of Old List: 140673303268168New List: , , ]ID of New List: 140673303268168

出力からわかるように、変数old_listとnew_listの両方が同じidを共有します。140673303268168

したがって、new_listまたはold_listの値を変更する場合、変更は両方で表示されます。

基本的に、元の値を変更せずに新しい値のみを変更したり、その逆を変更したりすることがあります。, Pythonでは、コピーを作成する二つの方法があります:

  1. 浅いコピー
  2. 深いコピー

これらのコピーを動作させるには、copyモジュールを使用します。

コピーモジュール

浅いコピー操作と深いコピー操作には、Pythonのcopyモジュールを使用します。 たとえば、

import copycopy.copy(x)copy.deepcopy(x)

ここで、copy()xの浅いコピーを返します。deepcopy()xの深いコピーを返します。,

浅いコピー

浅いコピーは、元の要素の参照を格納する新しいオブジェクトを作成します。

したがって、浅いコピーはネストされたオブジェクトのコピーを作成せず、ネストされたオブジェクトの参照をコピーするだけです。 このように、コピー処理は行われませんrecurseを作成しコピーの入れ子物そのものです。,

例2:シャローコピーを使用してコピーを作成します

import copyold_list = , , ]new_list = copy.copy(old_list)print("Old list:", old_list)print("New list:", new_list)

プログラムを実行すると、出力は次のようになります。

Old list: , , ]New list: , , ]

上記のプログラムでは、ネストされたリストを作成し、copy()メソッドを使用してシャローコピーします。

これは、同じ内容を持つ新しい独立したオブジェクトを作成することを意味します。 これを確認するために、old_listとnew_listの両方を出力します。,

new_listがold_listと異なることを確認するために、新しいネストされたオブジェクトをoriginalに追加してチェックします。

例3:シャローコピーを使用してold_listに追加する

プログラムを実行すると、出力されます。

Old list: , , , ]New list: , , ]

上記のプログラムでは、old_listのシャローコピーを作成しました。 のnew_listを含むへの参照元の入れ子に格納されているオブジェクトold_list. 次に、新しいリスト、つまりをold_listに追加します。, この新しいサブリストはnew_listにコピーされませんでした。

ただし、old_list内のネストされたオブジェクトを変更すると、変更はnew_listに表示されます。

例4:浅いコピーを使用して新しいネストされたオブジェクトを追加する

import copyold_list = , , ]new_list = copy.copy(old_list)old_list = 'AA'print("Old list:", old_list)print("New list:", new_list)

プログラムを実行すると、次のように出力されます。

Old list: , , ]New list: , , ]

ディープコピー

ディープコピーは新しいオブジェクトを作成し、元の要素に存在するネストされたオブジェクトのコピーを再帰的に追加します。

例2を続けましょう。, ただし、deepcopy()copyモジュールに存在する関数を使用してディープコピーを作成します。 Deepコピーを作成し独自のコピー元のオブジェクトとそのすべての入れ子オブジェクト。

例5:deepcopy()を使用してリストをコピーする

import copyold_list = , , ]new_list = copy.deepcopy(old_list)print("Old list:", old_list)print("New list:", new_list)

プログラムを実行すると、次のように出力されます。

Old list: , , ]New list: , , ]

上記のプログラムでは、deepcopy()関数を使用して、似たようなコピーを作成します。,

ただし、元のオブジェクトold_list内のネストされたオブジェクトに変更を加えると、コピー new_listに変更は表示されません。

例6:ディープコピーを使用してリストに新しいネストされたオブジェクトを追加する

プログラムを実行すると、出力されます。

Old list: , , ]New list: , , ]

上記のプログラムでは、old_listに新しい値を割り当てると、old_listのみが変更されていることがわかります。 これは、old_listとnew_listの両方が独立していることを意味します。 これは、old_listが再帰的にコピーされたためです。