Pythonの多重リストをlist()でつくった場合に、元のリストにくわえた変更は影響を及ぼすのか?

Pythonでlist()を使って多重リストを作った後に元のリストに変更をくわえると、作成された多重リストにも影響は及ぶのか?

今回は多重リスト(リストの要素がリストであるリスト)を複製(コピー)する場合に、元のリストを変更すると複製されたリストにもその影響が及ぶのかどうかという問題の説明です。

前回記事:普通の単純なリストを複製する場合

まず多重リストではない普通の単純なリスト、すなわち、

[1, 2, 3]

というようなリストですね、この場合に、

  • これを複製して作ったリスト
  • 元のリスト

との関係について、元のリストが変更されたときに複製してできあがったリストが影響を受けるのかどうかという点を前回「Pythonでリストを複製する方法の違いについて、代入による方法とlist()関数による方法の違いとは?」で解説しました。

その記事では代入文による複製(その記事を解説するための一時的な独自の用語です)とlist()関数による複製では異なる結果になることを解説しました。

多重リストの複製の場合

では多重リストの場合に、複製元のリストを変更した場合にどのような影響が複製されたリストに及ぶのか調べてみましょう。

次のコードを見てください。

# ある多重リスト作成
primodial_list = [[1, 2, 3], ['Tom', 'Mary', 'Terry'], [4, 5, 6]]
id(primodial_list)

# copying list
original_list = primodial_list
copied_by_assign = original_list
copied_by_constructor = list(original_list)

# confirm identity
primodial_list is original_list
copied_by_assign is original_list
copied_by_constructor is original_list

# modify_1
primodial_list[0][0] = 0
original_list[1][2]='Alejandro'


# confirm independency_1
primodial_list is original_list  # True
primodial_list == original_list  # True
copied_by_assign  # 変更される
copied_by_constructor  # 変更される!!!

# modify_2
primodial_list.append(['orange', 'apple'])
original_list.append(['desk', 'chair'])

# confirm independency_2
id(primodial_list)  # 最初のidと同じ
primodial_list == original_list  # True
copied_by_assign  # 変更される
copied_by_constructor  # 変更されない

やってることは前回記事の「Pythonでリストを複製する方法の違いについて、代入による方法とlist()関数による方法の違いとは?」で使ったコードとほとんど同じなので解説は省きますが、コピペでもしてみて実際に少しずつ結果を確かめて見てください。

単純なリストの場合と多重リストの場合とでちょっと結果が異なるのがわかると思います。

さて以上のことと、前回記事の内容とを簡単にまとめておきましょう。

まとめ

単純なリストと多重リストの両方において、その複製方法の違いと、複製した結果出来上がったリストが、もともとのリストに加えられた変更によって影響を受けるのかどうかをまとめたものを表にしました。

単純リスト 多重リスト
代入文による複製 元リストの要素の値を変更 受ける 受ける
元リストにappendで要素追加受ける受ける
list()による複製 元リストの要素の値を変更 受けない 受ける
元リストにappendで要素追加受けない受けない

代入文による複製はすべての場合で、もともとのリストの変更によって影響を受けていますが、list()による複製は影響を受ける場合と受けない場合に分かれています。

以上のような検証はあまり厳密なものではありませんが、とにかく大切なことは、あるリストオブジェクトにくわえられた変更が他のリストオブジェクトに影響を与える場合があるということです。

その影響によってコードにエラーが出る場合もあるでしょう。

プログラミングを学びIT業界へ転職するなら現役エンジニアから学べるプログラミングスクールTechAcademy [テックアカデミー]でオンライン講座を受講するのが良いと思います。1人で悩みながら学習を進めるよりもわかりやすく、費やす時間も少なく合理的・効率的に学習できるからです。

など各種の講座が用意されています。無料で体験できるテックアカデミー無料体験も用意されています。