Pythonでリストをコピーする方法まとめ:スライス、list()、copyモジュールの使い分け
Pythonでは、代入演算子(=)を使っても新しいオブジェクトは作成されません。既存のオブジェクトに別の名前(参照)を付けるだけです。この挙動は、組み込み関数 id() を使うことで確認できます。
>>> L1 = [1,2,3,4] >>> L2 = L1 >>> id(L1) 185117137928 >>> id(L2) 185117137928
L1 と L2 のIDが同じであることから、両者が同一のオブジェクトを参照していることがわかります。つまり、どちらか一方を変更するともう一方にも影響が及びます。リストを本当に複製したい場合は、以下の方法を使いましょう。
方法1:スライス演算子を使う
スライス演算子の2つのオペランドは、それぞれスライスの開始インデックスと終了インデックスを表します。明示的に指定しない場合、両方ともシーケンスの先頭と末尾がデフォルトになります。この特性を利用すると、リスト全体のコピーを簡単に作成できます。
>>> L1 = [1,2,3,4] >>> L2 = L1[:] >>> L1 [1, 2, 3, 4] >>> L2 [1, 2, 3, 4] >>> id(L1) 185117025160 >>> id(L2) 185117171592
L1[:] によって新しいリストオブジェクトが生成され、id() の値が異なることから別オブジェクトであることが確認できます。
方法2:組み込みの list() 関数を使う
もう一つの手軽な方法は、組み込み関数 list() を使うことです。引数に渡したリストをもとに、新しいリストオブジェクトを作成します。
>>> L1 = [1,2,3,4] >>> L2 = list(L1) >>> L1 [1, 2, 3, 4] >>> L2 [1, 2, 3, 4] >>> id(L1) 185117295816 >>> id(L2) 185117209352
方法3:copyモジュールを使う(シャローコピーとディープコピー)
Pythonの標準ライブラリには copy モジュールが用意されており、オブジェクトの浅いコピー(シャローコピー)と深いコピー(ディープコピー)を行う関数が含まれています。
- copy.copy(): シャローコピー。外側のリストは新しく作られますが、ネストされた内側のリストは参照のみがコピーされます。
- copy.deepcopy(): ディープコピー。ネストされた要素まで再帰的にすべて複製されるため、完全に独立したコピーになります。
>>> import copy >>> L1 = [1,2,3,4] >>> L2 = copy.copy(L1) >>> L1 [1, 2, 3, 4] >>> L2 [1, 2, 3, 4] >>> id(L1) 185117025160 >>> id(L2) 185117295880 >>> L3 = copy.deepcopy(L1) >>> L3 [1, 2, 3, 4] >>> id(L3) 185117304328
まとめ
単純な一次元リストのコピーであれば、スライス L1[:] や list(L1) で十分です。一方、ネストしたリストや複雑なオブジェクトを扱う場合は、意図しない参照共有によるバグを防ぐために copy.deepcopy() を使うのが安全です。用途に応じて適切なコピー方法を選択しましょう。
-
Pythonでリストを定義する方法とは?基本の書き方を初心者向けに解説
リスト(List)は、Pythonにおける基本的なシーケンス型データ構造の一つです。複数の要素を角括弧 [ ] で囲み、カンマで区切って表現します。各要素は文字列や数値など異なるデータ型が混在していても問題ありません。また、リストは順序付き(ordered)コレクションであるため、格納した要素の並び順は保持されます。個々の要素には、0から始まるインデックスを使ってアクセスできます。たとえば最初の要素はインデックス 0、2番目の要素は 1 で参照します。リストの定義例list1 = [physics, chemistry, 1997, 2000] list2 = [1, 2, 3, 4, 5]
-
Pythonで文字列のリストを並べ替える方法:sort()とsorted()の使い分け
Pythonでは、文字列のリストを並べ替える方法が2つ用意されています。リスト自体を直接変更するsort()メソッドと、元のリストを保持したまま新しい並べ替え済みリストを作成するsorted()関数です。それぞれの特徴と使い方を解説します。 sort()メソッドでリストをその場で並べ替える sort()は、リストそのものを並べ替える「in-place(破壊的)」な操作です。元のリストの順序が直接変更されるため、戻り値を受け取る必要はありません。 >>> a = [Hello, My, Followers] >>> a.sort() >>>