概要

Pythonでリストをクローン(コピー)する際、単にnew_list = my_listのように代入すると、参照が共有され、両方のリストに影響が及びます。これを防ぐためには、浅いコピーや深いコピーを使用する必要があります。この記事では、それぞれの方法とその違いについて詳しく説明します。

浅いコピー

浅いコピーはリスト本体をコピーしますが、リスト内のオブジェクトは元のリストと共有されます。以下のような方法があります。

list.copy() メソッド

Python 3.3以降で導入された copy() メソッドを使うことで、浅いコピーが簡単に作成できます。

my_list = [1, 2, 3]
new_list = my_list.copy()

スライスを使ったコピー

スライス([:])を使用しても、同じく浅いコピーが作成できます。

my_list = [1, 2, 3]
new_list = my_list[:]

list() コンストラクタ

list()を使っても浅いコピーが可能です。

my_list = [1, 2, 3]
new_list = list(my_list)

深いコピー

深いコピーは、リスト内のすべてのオブジェクトを再帰的にコピーします。これにより、コピーされたリストと元のリストが完全に独立します。深いネストのリストを扱う際に有効です。

copy.deepcopy()

copy.deepcopy() を使用することで、リスト内のオブジェクトを含むすべての要素が新しいインスタンスとしてコピーされます。

import copy
my_list = [[1, 2], [3, 4]]
new_list = copy.deepcopy(my_list)

この場合、new_listの変更は元のmy_listには影響しません。

まとめ

リストをクローンする際、浅いコピーと深いコピーを使い分けることで、意図しない変更を防ぐことができます。浅いコピーは通常のリストに適していますが、リスト内に複雑なデータ構造が含まれる場合は、深いコピーが必要です。