記事内に広告が含まれています。

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

Python

こんにちは、モグです。

今回は、Pythonのリストの話。

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

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

この記事では、代入とコピーの違いを中心に、 リストをコピーするための代表的な方法(.copy()、list()、スライス)をまとめてみました。


この記事を書いた人
モグ

40代・ごく普通の女性フリーランスSE。
RPAをきっかけにフリーランスとして独立。
最近はさらにPythonやAIも学び副業にも挑戦中。
このブログでは、SEのリアル・スキルアップ・副業の試行錯誤を発信。

モグをフォローする

リストの代入とは

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

代入は変数同士で同じデータを共有するという意味です。

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

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

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

初心者の場合は、まずは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]

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

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

まとめ

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

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

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