Pythonプログラミング初心者に向けて、リストのコピーについて解説します。
前回はリストの要素の削除方法を学びました!
今回はリストを使ってどんなことを学ぶんですか?
今日はリストのコピー方法を学んでいきます!
要素の削除方法もたくさんのやり方があるので、ケースバイケースで使い分けられるようにしっかり勉強していきましょう!
Pythonのリストは、データの保持や操作に便利なデータ構造です。
リストを操作する際、元のリストを変更せずに別のリストを作成したい場合があります。
この記事では、Pythonのリストを安全にコピーする方法について解説します。
リストのコピーにより、データの複製と変更を自由に行えるように、ぜひ基本からきちんと理解していきましょう!
リストを別の変数に代入
以下の例のように、すでに存在するリストを別の変数に代入することでリストをコピーできます。
#リストanimalsを作成
animals = ['アザラシ', 'ネコ', 'イヌ']
#リストanimalsを別の変数copied_animalsに代入
copied_animals = animals
#コピー先のcopied_animalsを出力
print(copied_animals)
# 実行結果
# ['アザラシ', 'ネコ', 'イヌ']
この例では、animalsというリストを作成し、「'アザラシ', 'ネコ', 'イヌ'」の要素を格納しています。
次に、リストanimalsを変数copied_animalに代入しています。
これにより、変数copied_animalにはコピー元のリストanimalが代入されているので、変数copied_animalを出力すると['アザラシ', 'ネコ', 'イヌ']が出力されます。
リストのコピーは簡単にできるんだな~と感じたと思いますが、実はこのやり方には落とし穴があります!
さきほどのプログラムを変更したプログラムで見てみましょう!
さきほどのプログラムに追記した以下のプログラムを実行してみてください。
#リストanimalsを作成
animals = ['アザラシ', 'ネコ', 'イヌ']
#リストanimalsを別の変数copied_animalsに代入
copied_animals = animals
#コピー元のanimalsの要素を更新
animals[1] = "ぱんだ"
#コピー元のanimalsを出力
print(animals)
# 実行結果
# ['アザラシ', 'ぱんだ', 'イヌ']
#コピー先のcopied_animalsを出力
print(copied_animals)
# 実行結果
# ['アザラシ', 'ぱんだ', 'イヌ']
先ほどのプログラムを変更しanimalsの要素を変更しています。
animals[1] = "ぱんだ"
とした後に、コピー元のanimalsとコピー先のcopied_animalsを出力してみると、コピー先のcopied_animalsでも1番目の要素が「"ぱんだ"」に変わってしまいました。
コピー元のanimalsだけを変更したかったのに、コピー先のcopied_animalsも中身が変更されてしまいました..
そうなんです..
このコピー方法だと後から要素の変更や削除などを行ってしまうとコピー先・コピー元のリスト両方が変化してしまうんです!
ここで紹介した方法を用いるとコピー先・コピー元のリストに変更を加える時に注意が必要です。
続いて、コピー先・コピー元のリストに変更を加えても互いが影響しないコピー方法を学んでいきますが、ここで説明したコピー方法もぜひ知っておいてください。
スライスを使用したリストのコピー
スライスを使用することで、元のリストを切り出して新しいリストとしてコピーすることができます。
以下の例を見てみましょう。
#リストanimalsを作成
animals = ['アザラシ', 'ネコ', 'イヌ']
#リストanimalsを別の変数copied_animalsに代入
copied_animals = animals[:]
#コピー先のcopied_animalsを出力
print(copied_animals)
# 実行結果
# ['アザラシ', 'ネコ', 'イヌ']
この例では、animalsというリストを作成し、「'アザラシ', 'ネコ', 'イヌ'」の要素を格納しています。
次に、スライスを使用してリストanimalsからリスト全体を取り出して変数copied_animalに代入しています。
ここで登場したanimals[:]はスライスにおいて開始位置と終了位置を省略した形です。
これにより、開始位置から終了位置までの要素、つまり全ての要素を取り出せます。
したがって、変数copied_animalにはリストanimalから取り出された全ての要素が代入されているので、変数copied_animalを出力すると['アザラシ', 'ネコ', 'イヌ']が出力されます。
それでは、さきほどのプログラムに追記した以下のプログラムを実行してみてください。
#リストanimalsを作成
animals = ['アザラシ', 'ネコ', 'イヌ']
#リストanimalsをスライスして変数copied_animalsに代入
copied_animals = animals[:]
#コピー元のanimalsの要素を更新
animals[1] = "ぱんだ"
#コピー元のanimalsを出力
print(animals)
# 実行結果
# ['アザラシ', 'ぱんだ', 'イヌ']
#コピー先のcopied_animalsを出力
print(copied_animals)
# 実行結果
# ['アザラシ', 'ネコ', 'イヌ']
animalsの要素を変更しています。
animals[1] = "ぱんだ"
とした後に、コピー元のanimalsとコピー先のcopied_animalsを出力してみると、コピー元の1番目の要素は「"ぱんだ"」に変更されています。
しかし、コピー先のcopied_animalsでは1番目の要素は「"ネコ"」のまま変更されていません。
コピー元の変更がコピー先に反映されない別のリストを作ることができましたね!
list関数を使用したリストのコピー
list関数を使用すると、既存のリストを新しいリストとしてコピーすることができます。
以下の例を見てみましょう。
#リストanimalsを作成
animals = ['アザラシ', 'ネコ', 'イヌ']
#リストanimalsを別のリストとして変数copied_animalsに代入
copied_animals = list(animals)
#コピー先のcopied_animalsを出力
print(copied_animals)
# 実行結果
# ['アザラシ', 'ネコ', 'イヌ']
この例でも、animalsというリストを作成し、「'アザラシ', 'ネコ', 'イヌ'」の要素を格納しています。
次に、list関数を使用してリストanimalsリスト全体をコピーして変数copied_animalに代入しています。
ここで登場したlist関数を用いると元のanimalsとは別の変数を作成できます
したがって、変数copied_animalにはリスト関数でanimalからコピーしたリストが代入されているので、変数copied_animalを出力すると['アザラシ', 'ネコ', 'イヌ']が出力されます。
それでは、さきほどのプログラムに追記した以下のプログラムを実行してみてください。
リストのコピー方法もたくさんあるんですね!
そうですね!
リストのコピーについてもケースバイケースで使い分けるのでそれぞれの使い方を知っておいてくださいね!
最後に確認問題を解いて今回学んだ内容を復習しましょう!
確認問題
①以下の操作をしてください。
(1)整数「10, 20, 30」を格納したリストnums1を作成してください。
(2)copyed_nums1=nums1としてリストnums1をコピーしてください。
(3)コピー後に、リストnums1の要素「30」を「100」に変更して
copyed_nums1を出力してください。
②以下の操作をしてください。
(1)整数「10, 20, 30」を格納したリストnums2を作成してください。
(2)リストのスライスを用いてnums2のすべての要素をコピーし、
リストcopyed_nums2に格納してコピーしてください。
(3)コピー後に、リストnums2の要素「20」を「0」に変更して
copyed_nums2を出力してください。
③以下の操作をしてください。
(1)整数「10, 20, 30」を格納したリストnums3を作成してください。
(2)list関数を用いてnums3のコピーを作成し、
リストcopyed_nums3に格納してください。
(3)コピー後に、リストnums3の要素「30」をdel文を使って削除して
copyed_nums2を出力してください。
確認問題 解答例
①の回答例
#①以下の操作をしてください。
# (1)整数「10, 20, 30」を格納したリストnums1を作成してください。
nums1 = [10, 20, 30]
# (2)copyed_nums1=nums1としてリストnums1をコピーしてください。
copyed_nums1 = nums1
# (3)コピー後に、リストnums1の要素「30」を「100」に変更して
# copyed_nums1を出力してください。
nums1[2] = 100
print(copyed_nums1)
# 実行結果
# [10, 20, 100]
①において「リストを別の変数に代入」してコピーを行っています。
したがって、コピー元にあたるnum1の要素を変更すると、コピー先のcopyed_nums1も変更されてしまいますね!
#②以下の操作をしてください。
# (1)整数「10, 20, 30」を格納したリストnums2を作成してください。
nums2 = [10, 20, 30]
# (2)リストのスライスを用いてnums2のすべての要素をコピーし、
# リストcopyed_nums2に格納してコピーしてください。
copyed_nums2 = nums2[:]
# (3)コピー後に、リストnums2の要素「20」を「0」に変更して
# copyed_nums2を出力してください。
nums2[1] = 0
print(copyed_nums2)
# 実行結果
# [10, 20, 30]
②においては「スライスを使用したリストのコピー」を行っています。
したがって、コピー元にあたるnum2の要素を変更しても、コピー先のcopyed_nums2は変更されませんね!
#③以下の操作をしてください。
# (1)整数「10, 20, 30」を格納したリストnums3を作成してください。
nums3 = [10, 20, 30]
# (2)リストのスライスを用いてnums3のすべての要素をコピーし、
# リストcopyed_nums3に格納してコピーしてください。
copyed_nums3 = list(nums3)
# (3)コピー後に、リストnums3の要素「30」をdel文を使って削除して
# copyed_nums2を出力してください。
del nums3[2]
print(copyed_nums3)
# 実行結果
# [10, 20, 30]
③においては「list
関数を使用したリストのコピー」を行っています。
したがって、コピー元にあたるnum3の要素を変更しても、コピー先のcopyed_nums3は変更されませんね!
ここで要素の削除を行う際に用いたdel文について、使い方を忘れてしまった方は以下の記事を参照ください!
まとめ
この記事では、Pythonのリストをコピーする方法について解説しました。
具体的にはリストを別の変数に代入する方法、スライスを使用したコピー、list()
関数を用いる方法を学びました。
リストのコピーを適切に行うことで、データの複製と変更の安全性を確保し、プログラムのバグを回避できます。
リストのコピーを効果的に活用し、データの操作と保護を行いながら、Pythonプログラムの開発を行いましょう。
次回はリストの中にリストを作成する2重のリストについて解説します。
お楽しみに!
このサイトの記事一覧へは以下へアクセス!
コメント