Python3 – リストのコピー

変数の代入

リストなどのミュータブルオブジェクトのコピーには注意を要する。

単に変数を代入した場合、元のオブジェクトへの変更は同じ参照の全ての変数に影響する。

copy()関数・copy()メソッド

copyモジュールのcopy()関数を使うと、リストの各要素のインスタンスが新たに生成され、その内容がコピーされる。このため、コピー元への変更の影響はない。

deepcopy()関数による完全な複製

2次元配列など、ミュータブルオブジェクトの要素がミュータブルな場合は、copy()だけでは各要素への参照が変わらないため、下位の要素の変更が波及する。このような上位要素のみに対するコピーをシャローコピーと呼ぶ。

ミュータブルオブジェクトを要素に持つミュータブルオブジェクトの完全な複製を得るには、copy.deepcopy()関数を使う。

リストのコピーの別方法

copy()関数はcopyモジュールをインポートする必要があるが、以下の方法はcopyモジュールがなくても同じ結果が得られる。

copy()メソッド

リストのcopy()メソッドは、copy.copy()関数と同じく各要素の複製を生成する。

[:]

リストのスライスは元のリストの要素を生成し、新たなリストを返す。スライスを全要素[:]とすることで、元のリストの複製が得られる。

ただし、copy()メソッドもスライスによる方法もシャローコピーなので、多次元配列などのディープコピーはできない。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です