Python入門

Pythonでリストを2つの変数に代入すると両方変わる理由【参照の仕組みを解説】

「リストを別の変数にコピーしたはずなのに、片方を変更したらもう片方まで変わってしまった…😱」

Pythonを始めたばかりの方がハマりやすい、このビックリ現象。実はPythonの変数の仕組みを理解すると、「なるほど!」と一気に納得できます。今回はこの不思議な挙動をわかりやすく解説していきます!

🔍 まず現象を確認してみよう

python programming
python programming / Photo by Myburgh Roux via Pexels

こんなコードを見てください。これ、実行せずに正確に答えられますか?

# リストを変数aに代入して、bにもコピー(のつもり)
a = [1, 2, 3]
b = a          # aをbに代入

b.append(4)    # bにだけ要素を追加したつもり…

print(a)       # → どうなる?
print(b)       # → どうなる?

実行結果はこうなります。

[1, 2, 3, 4]
[1, 2, 3, 4]

bを変更したのに、aまで変わってしまっています!初めて見ると「バグ?」と思いますよね。でもこれ、Pythonの仕様どおりの動作なんです。

💡 変数は「ラベル(名前)」にすぎない

ここが核心です。Pythonの変数はデータそのものを入れる箱ではなく、オブジェクトへの「参照(リファレンス)」です。

イメージとしては、こんな感じです。

  • リスト [1, 2, 3] というデータがメモリ上のどこかに存在する
  • a = [1, 2, 3] と書くと、「a」というラベルがそのデータを指す
  • b = a と書くと、「b」というラベルも同じデータを指すだけ

つまり、abは別々のリストを持っているのではなく、同じひとつのリストを2つの名前で呼んでいる状態なんです。

🛠 本当にコピーしたいときはどうする?

ポイントをまとめるとこんな感じです。リストを独立したコピーとして複製するには、以下のいずれかの方法を使います。

a = [1, 2, 3]

# 方法①:スライスでコピー
b = a[:]

# 方法②:copyメソッドでコピー
b = a.copy()

# 方法③:list()でコピー
b = list(a)

b.append(4)

print(a)  # → [1, 2, 3]   ← 変わらない!✅
print(b)  # → [1, 2, 3, 4]

これでab別々のリストオブジェクトになるので、片方を変えてももう片方には影響しません。

⚠️ ネストしたリストには注意!


ただし、リストの中にリストが入っている(ネスト構造)場合は、上記の方法では浅いコピー(shallow copy)しかされません。

完全に独立したコピーが必要なときは、copyモジュールのdeepcopy()を使いましょう。

import copy

a = [[1, 2], [3, 4]]
b = copy.deepcopy(a)  # 深いコピー(deep copy)

b[0].append(99)

print(a)  # → [[1, 2], [3, 4]]   ← 変わらない!✅
print(b)  # → [[1, 2, 99], [3, 4]]

まとめ

Pythonの変数は「データの入れ物」ではなく、オブジェクトへの参照(名前)です。リストを別の変数に代入するだけでは、同じリストを2つの名前で指しているにすぎません。本当にコピーしたいときは .copy() やスライス [:] を使うことを覚えておきましょう!

ぜひ自分のコードで実際に試してみてください 🐍✨ この仕組みを理解しておくと、将来的に関数へのリスト渡しでもハマらずに済みますよ。

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る

Python Web開発実践入門 ―― FastAPIによるWebAPI開発と非同期処理

もしも

Python Web開発実践入門 ―― FastAPIによるWebAPI開発と非同期処理

FastAPIでWebAPI開発を実践的に学ぶ

Amazonで見る

ESP32&Arduino 電子工作 プログラミング入門

もしも

ESP32&Arduino 電子工作 プログラミング入門

ESP32とArduinoで電子工作を学ぶ入門書

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です