【Python】リストの代入とコピーの違い。copy・listの使い分けも。

Python

Pythonでリストを扱うとき、「コピーしたつもりなのに元のリストまで変わってしまった!」という経験はありませんか?

これは代入とコピーの違いを正しく理解していないことが原因です。

この記事では、Pythonのリストにおける代入とコピーの違いを中心に、 リストをコピーするための代表的な方法(.copy()list()、スライス)を具体例とともに丁寧に解説します。


サイト運営者
momo

大阪在住の40代女性SE。現在は、子供2人を育てながら自宅でフリーランスとして働いています。主に業務効率化を請け負っており、最近は生成AIについても猛勉強中。

momoをフォローする
003_midworks_img_300x250

リストの代入とコピーの違い

まず最初に、「代入」はコピーではありません。

代入は変数同士で同じデータを共有するだけです。

例を見たほうが分かりやすいので、まずはこの例を見てください。

a = [1, 2, 3]
b = a  # 代入
b.append(4) # b に4を追加

print(a)  # [1, 2, 3, 4] → a にも 4 が追加されてしまった
print(b)  # [1, 2, 3, 4]

このように b = a とすると、a と b はまったく同じリストを指すようになります。

aが参照している箱に[1,2,3]というリストが入っていて、bも同じ箱を見に行くようになる、というイメージです。

同じ箱を見にいくので、bで行った変更がaにも反映されてしまいます。

初心者がよくハマるポイントのひとつです。

リストをコピーする

では、bの変更をaに反映したくないときはどうすればよいか、というと、そのときは代入ではなくコピーを使います。

コピーでよく使われる方法としては、以下があります。

・copy
・list
・スライス
・deepcopy

では、どう違うのか、見ていきましょう。

momo
momo

初心者の場合は、まずはcopy()だけ読んで、他は飛ばしてもらっても大丈夫です。

.copy() でコピーする

Pythonのリストには .copy() というメソッドがあり、これを使うと別のリストとしてコピーできます。

a = [1, 2, 3]
b = a.copy() # 代入ではなくコピー
b.append(4) # b に4を追加

print(a)  # [1, 2, 3] → a には 4 が追加されない
print(b)  # [1, 2, 3, 4]

このように .copy() はリストの中身を新しく別の場所(箱)にコピーします。 そのため、bを変更してもaには影響しません。

bとaは、別の箱を見ることになったからです。

list() でコピーする

次に紹介するのは list() 関数を使う方法です。

さっきのcopyは関数ではなくメソッドなので、書き方が少し違いますが、結果は同じになります。

a = [1, 2, 3]
b = list(a) # 代入ではなくコピー
b.append(4) # b に4を追加

print(a)  # [1, 2, 3] → a には 4 が追加されない
print(b)  # [1, 2, 3, 4]

copyと同じように、bとaは、別の箱を見ることになったことがわかります。

.copy() と list() の使い分け

  • .copy():リスト専用。リストであることが確実なときに使う。
  • list():リスト以外に、文字列やタプルなどもリストに変換できる。
list('abc')  # ['a', 'b', 'c']
list((10, 20, 30))  # [10, 20, 30]

スライス [:] でコピーする

スライスで全体をコピーすることもできます。

a = [1, 2, 3]
b = a[:] # スライスでコピー
b.append(4) # b に4を追加

print(a)  # [1, 2, 3] → a には 4 が追加されない
print(b)  # [1, 2, 3, 4]

書き方が簡潔なので好んで使う人も多いです。

momo
momo

パッと見てコピーだとわかりにくいので、copyをあえて使う方が個人的には好きです。そういうのに気を付けておくと、後からメンテしやすくなります。

まとめ

方法特徴コピー元に影響?
b = a代入(同じリストを共有)✅ 影響あり
b = a.copy()リスト専用❌ 影響なし
b = list(a)リスト以外も使える❌ 影響なし
b = a[:]スライス❌ 影響なし

リストを扱うとき、「元のリストも変わっちゃった!」というトラブルはよくありまして、 そんなときは、「代入ではなくコピーが必要だった」ケースがほとんどです。

結論、元の値を変えたくないときは、代入ではなく.copy()list()でコピーした方が安全、と覚えておくと良いと思います

私も利用しているフリーランス向けエージェント。1年目から年収600万を実現し、毎年報酬アップしています。
難しい契約や交渉は完全にお任せできるので安心。
登録も面談も完全無料なので、自分の市場価値や将来性を確認するだけでも価値ありです。

Python
momoをフォローする
タイトルとURLをコピーしました