Python - 配列のコピー

こんにちは、Pythonプログラマー志願者の皆さん!今日は、Pythonでの配列のコピーについて深く掘り下げていきます。あなたの親しみのある近所のコンピューターサイエンスの先生として、この旅を案内することができることを楽しみにしています。だから、お気に入りの飲み物を持って、心地よく座り、一緒にこの冒険に出かけましょう!

Python - Copy Arrays

Pythonにおける配列の理解

配列をコピーする前に、Pythonにおける配列の理解を一旦簡単にリフレッシュしましょう。Pythonでは、配列をリストとして表現することが一般的です。リストは多様で、さまざまなタイプのデータを保持することができます。

以下は、Pythonでのリストの簡単な例です:

fruits = ["apple", "banana", "cherry"]
print(fruits)

出力:

['apple', 'banana', 'cherry']

この例では、fruitsは3つの文字列要素を含む私たちのリスト(または配列)です。

では、これらの配列をどのようにコピーするかを探っていきましょう!

代入演算子を使用して配列をコピー

配列をコピーする最も簡単な方法は、代入演算子(=)を使用することに見えるかもしれません。しかし、この方法には注意点があります。それを実際に見てみましょう:

original_list = [1, 2, 3, 4, 5]
copied_list = original_list

print("Original list:", original_list)
print("Copied list:", copied_list)

# そして、コピーされたリストを修正しましょう
copied_list[0] = 100

print("\n修正後:")
print("Original list:", original_list)
print("Copied list:", copied_list)

出力:

Original list: [1, 2, 3, 4, 5]
Copied list: [1, 2, 3, 4, 5]

修正後:
Original list: [100, 2, 3, 4, 5]
Copied list: [100, 2, 3, 4, 5]

驚きですね!copied_listを修正したとき、original_listも変わったのです!これは、代入演算子が新しいリストを作成しないためです。代わりに、両方の変数が同じメモリ内のリストを指しているからです。友達に自分の家の鍵を渡すのと同じです - 彼らは新しい家を得るのではなく、あなたの家にアクセスするだけです!

シャローコピーの方法

この問題を避けるために、シャローコピーの方法を使用することができます。これらは新しいリストを作成しますが、要素はまだ同じオブジェクトを参照します。以下に、シャローコピーを作成するいくつかの方法を見ていきます:

  1. copy()メソッドを使用する:
original_list = [1, 2, 3, 4, 5]
copied_list = original_list.copy()

copied_list[0] = 100

print("Original list:", original_list)
print("Copied list:", copied_list)

出力:

Original list: [1, 2, 3, 4, 5]
Copied list: [100, 2, 3, 4, 5]
  1. list()コンストラクタを使用する:
original_list = [1, 2, 3, 4, 5]
copied_list = list(original_list)

copied_list[0] = 100

print("Original list:", original_list)
print("Copied list:", copied_list)

出力:

Original list: [1, 2, 3, 4, 5]
Copied list: [100, 2, 3, 4, 5]
  1. スライシングを使用する:
original_list = [1, 2, 3, 4, 5]
copied_list = original_list[:]

copied_list[0] = 100

print("Original list:", original_list)
print("Copied list:", copied_list)

出力:

Original list: [1, 2, 3, 4, 5]
Copied list: [100, 2, 3, 4, 5]

これらの方法は、シンプルなリストに対しては素晴らしいです。しかし、リストのリストを持っている場合はどうでしょうか?そんな場合は、もっと強力な手段が必要です!

ディープコピーを使用して配列をコピー

ネストされたリストや複雑なオブジェクトを扱う場合、ディープコピーを使用する必要があります。これは、元のリストの完全に独立したコピーを作成し、すべてのネストされたオブジェクトを含むものです。それは、あなたの家と中のすべてをクローンするのと同じです!

ディープコピーを使用するには、copyモジュールをインポートする必要があります:

import copy

original_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
deep_copied_list = copy.deepcopy(original_list)

deep_copied_list[0][0] = 100

print("Original list:", original_list)
print("Deep copied list:", deep_copied_list)

出力:

Original list: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Deep copied list: [[100, 2, 3], [4, 5, 6], [7, 8, 9]]

見ての通り、ディープコピーされたリストを修正しても、元のリストに影響を与えません、ネストされた要素にも適用されます。

ディープコピーを使用するタイミング

ディープコピーは強力ですが、パフォーマンス上のコストがあります。それは、あなたの家を全部詰めて引っ越すのと同じです - もっと時間と努力がかかります!以下の場合にディープコピーを使用してください:

  1. ネストされたリストや複雑なオブジェクトを持っている場合
  2. 元のデータとコピーされたデータの間に完全な独立性を確保する必要がある場合
  3. リスト内の変更可能なオブジェクトを扱っている場合

コピー方法のまとめ

以下に、今日話したコピー方法をまとめたハンドリングテーブルを示します:

方法 構文 コピーの種類 使用例
代入(= new_list = old_list 参照(コピーなし) 両方の変数が同じリストを参照する必要がある場合
copy()メソッド new_list = old_list.copy() シャローコピー 変更不可な要素を持つシンプルなリストの場合
list()コンストラクタ new_list = list(old_list) シャローコピー 変更不可な要素を持つシンプルなリストの場合
スライシング new_list = old_list[:] シャローコピー 変更不可な要素を持つシンプルなリストの場合
copy.deepcopy() new_list = copy.deepcopy(old_list) ディープコピー ネストされたリストや変更可能な要素を持つリストの場合

覚えておいてください、正しいコピー方法を選ぶことは、仕事に適したツールを選ぶことと同じです。ソledgehammerを使ってピクチャーフレームを挂けることはありませんよね?同様に、ニーズを満たす最もシンプルなコピー方法を使用してください。

結論

おめでとうございます!Pythonスキルを上達させ、配列のコピーをマスターしたんです。シンプルな代入からディープコピーまで、さまざまなシナリオに対応するツールキットをお持ちできます。練習は成功のみをもたらすので、自分のプロジェクトでこれらの方法を試してみてください。

今日の話を締めくくる前に、ちょっとしたプログラマーアンチョッティングをどうぞ:なぜプログラマーは仕事を辞めたのか?配列を理解していなかったからです!? (分かりましたか?アライズを言いたいのです!)

コーディングを続け、学び続け、最も重要なのは、Pythonを楽しんでいきましょう!

Credits: Image by storyset