浅いコピーと深いコピーの主な違いは、浅いコピーは新しいオブジェクトを作成し、元のオブジェクトで見つかった子オブジェクトへの参照をその中に入れるのに対し、深いコピーは新しいオブジェクトを作成し、元のオブジェクトで見つかった子オブジェクトのコピーを再帰的にその中に入れるという点です。
Pythonなどのプログラミング言語では、オブジェクトのコピーを作成するために=演算子を使用することができます。
しかし、これはオブジェクトを作成するわけではありません。
元のオブジェクトの参照を共有する新しい変数が作成されるだけです。
プログラミングでは、元の値は変更せず、新しい値だけを変更することが必要な場合があります。
Pythonでは、コピーを作成する方法が2つあります。
それは、シャローコピーとディープコピーです。
コピーモジュールとは
浅いコピーや深いコピーを動作させるためには、プログラムはコピーモジュールで構成されている必要があります。
プログラマは “import copy” モジュールを使用することができる。
さらに、copy()はオブジェクトの浅いコピーを返し、deepcopy()はオブジェクトの深いコピーを返します。
シャローコピーとは
シャローコピーとは、元の要素の参照を格納した新しいオブジェクトを作成する処理のことです。
ネストされたオブジェクトのコピー自体は作成されません。
以下に例を示します。
図1: pythonによるシャローコピープログラム
上記のプログラムでは、old_listはネストしたリストです。
そして、copy()メソッドでnew_listにコピーしている。
同様に、同じ内容の新しいオブジェクトが作成されます。
したがって、old_listとnew_listを印刷すると、コンソールに同じ出力が表示されます。
さらに、9行目では、中間配列の最初のインデックス要素に新しい値を追加しています。
再度old_listとnew_listを印刷すると、old_listとnew_listは同じオブジェクトの参照を共有しているので、両方の要素が変更されることがわかります。
ディープコピーとは
ディープコピーとは、新しいオブジェクトを作成する際に、元の要素のネストしたオブジェクトのコピーを再帰的に新しいオブジェクトに挿入する処理のことである。
つまり、ディープコピーは、元のオブジェクトと関連するネストしたオブジェクトの独立したコピーを作成することができるのです。
図2:Pythonによるディープコピープログラム
上記プログラムでは、old_listはネストしたリストです。
これをdeepcopy()メソッドでnew_listにコピーする。
同様に、同じ内容の新しいオブジェクトを生成しています。
したがって、old_listとnew_listを印刷すると、コンソール上に同じ出力が表示されます。
さらに、9行目では、中間配列の最初のインデックス要素に新しい値を追加しています。
再度、old_listとnew_listを表示すると、old_listだけが変更されていることが分かる。
これは、両者が別のオブジェクトであるためです。
シャローコピーとディープコピーの違い
定義
シャローコピーとは、新しいコレクションオブジェクトを作成し、オリジナルで見つかった子オブジェクトへの参照をそのオブジェクトに入れることである。
一方、ディープコピーは、新しいコレクションオブジェクトを構築し、元のオブジェクトで見つかった子オブジェクトのコピーを再帰的に投入する処理です。
このように、シャローコピーとディープコピーの主な違いはこの点にあります。
機能性
さらに、浅いコピーは再帰しないし、子オブジェクト自体のコピーも作成しませんが、深いコピーは元のオブジェクトとそのすべての子オブジェクトの完全な独立したクローンを作成します。
コピー処理
浅いコピーと深いコピーのもう一つの違いは、浅いコピーは再帰的でないのに対して、深いコピーは再帰的であることです。
結論
Pythonなどのプログラミング言語では、オブジェクトをコピーすることが可能です。
コピーにはシャローコピーとディープコピーと呼ばれる2つのタイプがあります。
シャローコピーとディープコピーの主な違いは、シャローコピーは新しいオブジェクトを作成し、元のオブジェクトにある子オブジェクトの参照をそのオブジェクトに入れるのに対し、ディープコピーは新しいオブジェクトを作成し、元のオブジェクトにある子オブジェクトのコピーを再帰的にそのオブジェクトに入れるという点です。