Python
 Computer >> コンピューター >  >> プログラミング >> Python

コピー-Pythonでの浅いコピー操作と深いコピー操作


Pythonでは、変数はオブジェクトへの単なる参照です。したがって、別の変数に割り当てられると、オブジェクトをコピーするのではなく、同じオブジェクトへの別の参照として機能します。これは、id()関数を使用して確認できます

>>> L1 = [1,2,3]
>>> L2 = L1
>>> id(L1), id(L2)
(2165544063496, 2165544063496)

上記のコードの結果は、両方のリストオブジェクトのid()が同じであることを示しています。これは、両方が同じオブジェクトを参照していることを意味します。 L2はL1の浅いコピーであると言われています。どちらも同じオブジェクトを参照しているため、どちらかを変更すると、他のオブジェクトにも反映されます。

>>> L1 = [1,2,3]
>>> L2 = L1
>>> L2[1] = 100
>>> L1,L2
([1, 100, 3], [1, 100, 3])

上記の例では、インデックス番号のアイテム。 L2の1が変更されます。この変化は両方に現れています。

コピー操作でまったく新しいオブジェクトが作成され、ネストされたオブジェクトのコピーも再帰的に追加される場合、そのコピーはディープコピーと呼ばれます。

Python標準ライブラリのコピーモジュールには、次の2つの方法があります。

  • copy.copy()–浅いコピーを作成します
  • copy.deepcopy()–ディープコピーを作成します

浅いコピーは新しいオブジェクトを作成し、元の要素の参照を保存しますが、ネストされたオブジェクトのコピーは作成しません。ネストされたオブジェクトの参照をコピーするだけです。その結果、コピープロセスは再帰的ではありません。

>>> import copy
>>> L1 = [[1,2,3], [4,5,6]]
>>> L2 = copy.copy(L1)
>>> L1,L2
([[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]])
>>> L2.append([10,10,10])
>>> L1,L2
([[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6], [10, 10, 10]])

ここで、L1はネストされたリストであり、L2はその浅いコピーです。親リストオブジェクトへの参照はL2にコピーされますが、そのネストされた要素はコピーされません。したがって、L2に別のリストを追加しても、L1には反映されません

ただし、子要素の要素を変更しようとすると、その効果は両方のリストに表示されます

>>> L1 = [[1,2,3], [4,5,6]]
>>> L2 = copy.copy(L1)
>>> L1,L2
([[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]])
>>> L2[1][0] = 100
>>> L1,L2
([[1, 2, 3], [100, 5, 6]], [[1, 2, 3], [100, 5, 6]])

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

次の例では、L2はL2のディープコピーです。これで、内部リストの要素を変更すると、他のリストには表示されなくなります。

>>> L1 = [[1,2,3], [4,5,6]]
>>> L2 = copy.deepcopy(L1)
>>> L1,L2
([[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]])
>>> L2[1][0] = 100
>>> L1,L2
([[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [100, 5, 6]])

したがって、ディープコピーの効果は出力によって検証されます。


  1. Javaでのディープコピーとシャローコピー

    ディープコピーとシャローコピーはどちらも、さまざまな方法で指定されたオブジェクトのコピーを作成することを指します- 浅いコピー これは基本的にオブジェクトの新しいインスタンスを作成し、元のデータセットから新しく作成されたインスタンスにすべてのデータをコピーします。これは、新しく作成されたインスタンスを元のオブジェクトに具体的にキャストする必要があることを意味します。 「浅いクローン」とも呼ばれます。 例 import java.util.* ; class Demo{    private int[] my_data;    public Demo(i

  2. PythonとTkinterを使用してクリップボードからコピーする

    クリップボードからコピーするには、 clipboard_get()を使用できます Tkinterの方法。例を見て、クリップボードからデータを取得してTkinterウィンドウに表示する方法を見てみましょう。 ステップ- tkinterライブラリをインポートし、tkinterフレームのインスタンスを作成します。 ジオメトリを使用してフレームのサイズを設定します メソッド。 次に、 clipboard_get()を呼び出します クリップボードからテキストを取得し、データを変数 cliptextに保存します 。 クリップボードのテキストを表示するためのラベルを作成します。 クリ