はじめに
このチュートリアルでは、Pythonの例の助けを借りて、浅いコピーと深いコピーについて説明します。 深いコピーと浅いコピーの定義と、Python言語での実装について説明し、二つのタイプのコピーの間のコアな違いを評価します。
私たちが書く多くのプログラムでは、それらがどれほど基本的であっても、計算効率のような多くの理由のためにリストやオブジェクトをコピーする必要があることになります。, これを行うには、深いコピーまたは浅いコピーを作成する二つの方法があります。 両者の違いについて議論する前に、まず深いコピーと浅いコピーが正確に何であるかを理解しましょう。
Pythonのディープコピー
ディープコピーは、独自のメモリアドレスを持つオブジェクトまたはリスト全体の新しい個別のコピーを作成します。 これが意味するのは、オブジェクト/リストの新しいコピーで行った変更は元のものに反映されないということです。 このプロセスは、最初に新しいリストまたはオブジェクトを作成し、次に元の要素から新しい要素に再帰的にコピーすることによって発生します。,
簡単に言えば、両方のオブジェクトはお互いに完全に独立しています。 これは、C++、Java、C#などの言語で値渡しの概念に似ています。
ディープコピーの例
Pythonでディープコピーの概念を実装するには、copyモジュールを使用します。
result_A
というリストのリストがあり、学校の最初の二年間の3科目の学生Aの成績を含み、学生Bの結果のまったく同じリストを作成したいとします。, result_A
リストの詳細コピーを作成し、後でその詳細コピーをいくつか変更して学生Bの成績を表示します。
例1:
上記のスクリプトでは、copy
モジュールからdeepcopy
メソッドを使用してリストresult_A
へresult_B
. 次に、両方のリストの内容を画面に印刷します。
出力:
, ], ]
ご覧のとおり、リストは同じです。 この記事の後半では、これが浅いコピーとどのように異なるかを見ていきます。,
Pythonの浅いコピー
浅いコピーは、別の新しいオブジェクトオブジェクトまたはリストを作成しますが、子要素を新しいオブジェクトにコピーする代わりに、単にメモリアドレスへの参照をコピーします。 したがって、元のオブジェクトに変更を加えると、コピーされたオブジェクトに反映され、その逆もまた同様です。 簡単に言えば、両方のコピーはお互いに依存しています。 これは、C++、C#、Javaなどのプログラミング言語で参照渡しの概念に似ています。,
シャローコピーの例
これをPythonで実装するには、copy
モジュールを再度使用しますが、今回はcopy
関数を呼び出します。
浅いコピーの例にも同じサンプルリストを使用しましょう。
例2:
# Program 2 - Shallow Copyimport copyresult_A = , ]result_B = copy.copy(result_A)print(result_A)print(result_B)
上記のスクリプトでは、copy
モジュールのcopy
メソッドを使用して、listresult_A
の浅いコピーを作成します。result_B
という名前を付けました。, 次に、両方のリストの内容がコンソールに印刷されました。
出力:
, ], ]
繰り返しますが、リストは期待どおり同じです。 次に、copy
とdeepcopy
関数から得られる結果の違いについて説明します。
ディープコピーとシャローコピーの違い
シャローコピーとディープコピーとは何か、なぜコピーを作成するのかについて説明したので、それらの違いについて,
- ディープコピーはオブジェクトの値のコピーを格納しますが、シャローコピーストーリーは元のメモリアドレスへの参照
- ディープコピーは元のオブジェクト内の新しい/コピーされたオブジェクトに加えられた変更を反映しません。
実装に移る前に、このシナリオを想像してみてください。 二人が飲み物を分かち合いたいとしましょう。, 彼らは二つの方法でこの飲み物を共有することができます:
- 一つのグラスに飲み物を入れて、共有するためにそのグラスに両方のストローを入れて
- 両方のグラスに飲み物を入れて、それぞれのグラスに一つのストローを入れて
最初のシナリオは浅いコピーのことです。 両方の変数/インスタンスは、操作のために同じメモリ位置を指している/使用しています。 第二のシナリオは、ディープコピーのシナリオです。 これらを両立/インスタンスポイント利用の異なる二つのメモリ場所ができる。,
比較例
違いを明確にするために、例1から始めて、上記の二つの例でこの情報を使用してみましょう。
上記では、リストresult_A
を作成し、result_B
という名前の深いコピーを作成しました。 のコンテンツを変更してみましょうresult_B
そして、それがの内容に何らかの影響を与えるかどうかを確認しますresult_A
。
出力:
Original List:, ]Deep Copy:, ]
期待される結果は、元のリストが変更されないことです。, ご覧のとおり、ディープコピーの変更は元のリストには影響しませんでした。
さて、例2-浅いコピーで同じことを試してみましょう。
出力:
Original List:, ]Shallow Copy:, ]
ここで期待される結果は、元のリストとコピーされたリストの両方が単一の変更後に変更されることです。 そして、あなたが見ることができるように、浅いコピーに変更を加えると、その変更が元のリストにも反映されました。
結論
この記事では、浅いコピーと深いコピーとは何か、そして’copy’モジュールを使用してPython言語でそれらを作成する方法について話しました。, つまり、copy
とdeepcopy
の二つの関数を使用して、それぞれ浅いコピーと深いコピーを作成しました。 さらに、shallowコピーとdeepコピーの二つのコアの違いについて議論し、それらの違いをより良い方法で理解するためにpythonでshallowコピーとdeepコピーを実装しました。