Pythonでリストを扱うとき、「コピーしたつもりなのに元のリストまで変わってしまった!」という経験はありませんか?
これは代入とコピーの違いを正しく理解していないことが原因です。
この記事では、Pythonのリストにおける代入とコピーの違いを中心に、 リストをコピーするための代表的な方法(.copy()
、list()
、スライス)を具体例とともに丁寧に解説します。
リストの代入とコピーの違い
まず最初に、「代入」はコピーではありません。
代入は変数同士で同じデータを共有するだけです。
例を見たほうが分かりやすいので、まずはこの例を見てください。
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()
でコピーした方が安全、と覚えておくと良いと思います