Python でリストをコピーする

Azaz Farooq 2023年1月30日
  1. Python で copy() メソッドを使ってリストをコピーする
  2. Python でスライス方法を使用してリストをコピーする
  3. list() 関数を用いた Python でリストをコピーする
  4. リスト内包表記を使った Python でのリストのコピー
  5. copy.copy() メソッドを用いた Python でリストをコピーする
  6. Python リストのディープコピーとシャローコピー
Python でリストをコピーする

リストは Python で利用可能な柔軟なデータ型で、カンマで区切られた値を角括弧 [] で囲んだものです。リスト内の値は異なるデータ型にすることができます。リストのインデックスは 0 から始まり、連結やスライスも可能です。リストの値は、さまざまな組み込み関数を使って新しいリストの値としてコピーすることができます。

この記事では、Python でリストをコピーするためのさまざまな方法を紹介します。

Python で copy() メソッドを使ってリストをコピーする

Python のリストをコピーする最も直接的な方法は copy() メソッドです。リストのコピーを作成するシナリオを見つけることができます。等号 = はリストの複製を作成するために使用できます。しかし、新しいリストは既存のリストにリンクされます。つまり、元のリストを更新した場合、新しいリストも変更されます。新しいリストは、古いリストに似た項目を参照します。

既存のリストのコピーはリスト copy() メソッドによって生成されています。copy() メソッドは何もパラメータを取らません。

Python のリストとして果物の名前を例に挙げてみましょう。新しいリストは前のリストに存在する果物の名前をすべてコピーします。例のコードは以下のようになります。

fruits_spring = ["carrots", "kiwi", "grapes", "cherry"]
fruits_summer = fruits_spring.copy()
print(fruits_summer)

出力:

['carrots', 'kiwi', 'grapes', 'cherry']

Python でスライス方法を使用してリストをコピーする

Python では、スライスはリストからオブジェクトを抽出するためのメソッドです。スライス方法を使用すると、個々のオブジェクト、複数のアイテム、またはリストに含まれる全てのアイテムを取得することができます。

上の例を使って、スライシングを使ってリストをコピーする方法を説明しましょう。

完全な例のコードを以下に示します。

fruits_spring = ["carrots", "kiwi", "grapes", "cherry"]
fruits_summer = fruits_spring[:]
print(fruits_summer)

出力:

['carrots', 'kiwi', 'grapes', 'cherry']

これは、角括弧([:])で囲まれたコロンというクローン形式を使用しています。この処理により、古いリストのレプリカが生成されます。

list() 関数を用いた Python でリストをコピーする

Python の list() 関数を使ってリストのコピーを作成することもできます。list() 関数は 1つのパラメータをとります:リストに変換したいオブジェクトを指定します。

フルーツスタンドの例を使って、このアプローチを実演してみましょう。

fruits_spring = ["carrots", "kiwi", "grapes", "cherry"]
fruits_summer = list(fruits_spring)
print(fruits_summer)

出力:

['carrots', 'kiwi', 'grapes', 'cherry']

リスト内包表記を使った Python でのリストのコピー

このアプローチはリスト内包を利用します。for ループによって既存のすべてのリスト要素を反復処理し、新しいリスト要素を追加します。

完全なサンプルコードは以下の通りです。

fruits_spring = ["carrots", "kiwi", "grapes", "cherry"]
fruits_summer = [i for i in fruits_spring]
print(fruits_summer)

出力:

['carrots', 'kiwi', 'grapes', 'cherry']

copy.copy() メソッドを用いた Python でリストをコピーする

また、copy モジュールの copy() メソッドを使って Python のリストをコピーすることもできます。

完全なサンプルコードは以下の通りです。

import copy

fruits_spring = ["carrots", "kiwi", "grapes", "cherry"]

fruits_summer = copy.copy(fruits_spring)

print(fruits_summer)

出力:

['carrots', 'kiwi', 'grapes', 'cherry']

Python リストのディープコピーとシャローコピー

上記で紹介したメソッドはすべて浅いコピーです。浅いコピーとは、リスト要素が変異可能であり、この要素が元のリストで変更された場合、この変更はコピーされたリストにも反映されることを意味します。浅いコピーは、リスト要素へのポインタまたは参照のみをコピーします。

original_list = [["carrots", "apple"], "kiwi", "grapes", "cherry"]

print("The original list is")
print(original_list)

copied_list = original_list.copy()

original_list[0][0] = "banana"
original_list[0][1] = "apple"
original_list[1] = "orange"

print("The original list after modification is")
print(original_list)
print("The copied list is")
print(copied_list)

出力:

The original list is
[['carrots', 'apple'], 'kiwi', 'grapes', 'cherry']
The original list after modification is
[['banana', 'apple'], 'orange', 'grapes', 'cherry']
The copied list is
[['banana', 'apple'], 'kiwi', 'grapes', 'cherry']

元のリストの最初の要素もリストであり、これは変異可能です。その内容を変更すると、コピーされたリストの対応する要素が変更されます。一方、元のリストの 2 番目の要素は不変オブジェクトなので、その変更はコピーされたリストには反映されません。

深いコピーは、浅いコピーとは対照的に、元のリストのオブジェクトを新しいリストに再帰的にコピーします。そのため、元のリストの変更はコピーされたリストには反映されません。コピーモジュールの copydeepcopy() メソッドはディープコピー操作を行う。

import copy

original_list = [["carrots", "apple"], "kiwi", "grapes", "cherry"]

print("The original list is")
print(original_list)

copied_list = copy.deepcopy(original_list)

original_list[0] = ["banana", "apple"]
original_list[1] = "orange"

print("The original list after modification is")
print(original_list)
print("The copied list is")
print(copied_list)

出力:

The original list is
[['carrots', 'apple'], 'kiwi', 'grapes', 'cherry']
The original list after modification is
[['banana', 'apple'], 'orange', 'grapes', 'cherry']
The copied list is
[['carrots', 'apple'], 'kiwi', 'grapes', 'cherry']

関連記事 - Python List