Pythonの浅いコピー(シャローコピー)と深いコピー(ディープコピー)の徹底解説
Pythonにはcopyという標準モジュールが用意されており、これを使うことで「浅いコピー(シャローコピー)」と「深いコピー(ディープコピー)」を実現できます。
まず押さえておきたい重要なポイントとして、Pythonでは代入文(=)はオブジェクトそのものをコピーしません。代入はターゲット変数と元オブジェクトの間に参照(バインディング)を作るだけです。つまり、別の変数に代入しても、実体は同じオブジェクトを指しているため、片方を変更するともう片方にも影響が及びます。
copyモジュールを使うには、以下のようにインポートします。
import copy
copy.copy(x):浅いコピー(シャローコピー)
このメソッドは、オブジェクトxの浅いコピーを作成します。浅いコピーでは、元オブジェクトへの参照が新しいオブジェクトに複製されます。コピー先の入れ物自体は新しく作られますが、内部の要素まではコピーされません。そのため、コピーしたオブジェクト内の要素を変更すると、元オブジェクトの内容も一緒に変わってしまいます。
copy.deepcopy(x):深いコピー(ディープコピー)
このメソッドは、オブジェクトxの深いコピーを作成します。深いコピーでは、元オブジェクトからデータを取り出して、完全に独立した新しいオブジェクトが生成されます。そのため、コピー先のオブジェクトを変更しても、元オブジェクトは一切影響を受けません。
サンプルコード
import copy
my_mat = [[11,22,33],[44,55,66],[11,22,33]]
print('Matrix Before Updation: ' + str(my_mat))
# 浅いコピーを作成し、コピー先の要素を更新
new_mat = copy.copy(my_mat)
new_mat[2][0] = 77
new_mat[2][1] = 88
new_mat[2][2] = 99
print('Matrix After Updation: ' + str(my_mat)) # 元の行列も更新される
my_mat = [[11,22,33],[44,55,66],[11,22,33]]
new_mat_deep = copy.deepcopy(my_mat)
print('\nMatrix Before Updation: ' + str(my_mat))
# 深いコピーを作成し、コピー先の要素を更新
new_mat_deep[2][0] = 77
new_mat_deep[2][1] = 88
new_mat_deep[2][2] = 99
print('Matrix After Updation: ' + str(my_mat)) # 元の行列は変更されない
print('New Matrix: ' + str(new_mat_deep)) # 新しい行列のみ更新される実行結果
Matrix Before Updation: [[11, 22, 33], [44, 55, 66], [11, 22, 33]] Matrix After Updation: [[11, 22, 33], [44, 55, 66], [77, 88, 99]] Matrix Before Updation: [[11, 22, 33], [44, 55, 66], [11, 22, 33]] Matrix After Updation: [[11, 22, 33], [44, 55, 66], [11, 22, 33]] New Matrix: [[11, 22, 33], [44, 55, 66], [77, 88, 99]]
まとめ:使い分けのポイント
- copy.copy()(浅いコピー):ネストされたリストなどの内部要素は共有されるため、コピー先の変更が元オブジェクトに波及します。メモリ効率を重視したい場合や、要素の共有が問題にならない場面に向いています。
- copy.deepcopy()(深いコピー):全階層のデータが完全に複製されるため、元オブジェクトとは完全に独立します。安全にデータを編集したい場合や、入れ子構造を持つオブジェクトを扱う際に適しています。
特にリストの中にリストが入っているような多次元構造では、意図せず浅いコピーを使ってしまうとバグの原因になりやすいため、両者の違いをしっかり理解して使い分けることが大切です。
-
Javaのシャローコピーとディープコピーの違いを実例で徹底解説
シャローコピー(浅いコピー)とディープコピー(深いコピー)は、どちらも指定されたオブジェクトの複製を作成するための手法ですが、その仕組みと動作には重要な違いがあります。本記事では、それぞれの特徴をサンプルコードと実行結果をもとにわかりやすく解説します。 シャローコピー(浅いコピー) シャローコピーでは、オブジェクトの新しいインスタンスを作成し、元のオブジェクトからデータをコピーします。ただし、配列などの参照型フィールドに関しては、データの実体ではなく「参照」だけが渡される点に注意が必要です。そのため、コピー元のデータを変更すると、コピー先のオブジェクトにも同じ変更が反映されてしまいます。この
-
PythonとTkinterを使ってクリップボードの内容を取得して表示する方法
クリップボードからデータをコピー(取得)するには、Tkinterが提供する clipboard_get() メソッドを使用します。この記事では、実際のコード例を通じて、クリップボードからテキストデータを取得し、Tkinterウィンドウ上に表示する方法を解説します。 実装の手順 tkinterライブラリをインポートし、tkinterフレーム(ウィンドウ)のインスタンスを作成します。 geometry メソッドを使って、ウィンドウのサイズを設定します。 clipboard_get() を呼び出してクリップボードからテキストを取得し、変数 cliptext に格納します。 取得したテキストを表示す