Address
304 North Cardinal St.
Dorchester Center, MA 02124

Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM

Pythonのリストについて

Pythonのリストの注意点とは?元のリストにくわえた変更は影響を及ぼすのか?

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

今回はリストを作ってそれを変数に代入した場合に、元のリストを変更するとその変数のオブジェクト(もちろんリスト)にもその影響が及ぶのかどうかという問題の説明です。

問題点

たとえば次のコード例を見てください。


original_list = ["Google", "Apple", "Microsoft"]
copied_list = list(inner)
copied_list

これの結果はもちろん、

["Google", "Apple", "Microsoft"]

です。

この場合は、次の2つのリストが作成されています。

  • original_list
  • copied_list

では、originial_listを変更した場合、その変更はcopied_listにも影響を及ぼしてしまうのでしょうか?

単純なリストを使った場合の検証

観点

Pythonのリストには、単純なリストと、多重リスト(リストの中身がリストの場合)の2つがありますが、今回は単純なリストを使って検証してみます。

またリストの変更は、

  • appendを使う場合
  • 代入文を使う場合

の2種類に分けて以下説明することにします。

リストをappendを使って変更した場合

上のコード例をそのまま掲載します。

original_list = ["Google", "Apple", "Microsoft"]
copied_list = list(inner)
copied_list

結果は当然に、

["Google", "Apple", "Microsoft"]

ではoriginal_listを変更して、その末尾に文字列Amazonを追加します。

original_list.append("Amazon")
copied_list

結果は、

['Google', 'Apple', 'Microsoft', 'Amazon']

このように、copied_listも自動的に変更されてしまいました。

copied_list = list(inner)

というのを実行していないにもかかわらず、勝手にcopied_listまで変更されています。

この場合の両オブジェクトの同一性をis演算子を使って確かめてみましょう。

original_list is copied_list

結果は、

True

となり、実は同じオブジェクトであると判明しました。

代入文を使って変更した場合

original_list = ["Google", "Apple", "Microsoft", ]
copied_list = original_list
copied_list

original_list = ["Google", "Apple", "Microsoft", "Amazon"]
original_list  
copied_list  

こうすると、

origina_listの結果:['Google', 'Apple', 'Microsoft', 'Amazon']
copied_listの結果:['Google', 'Apple', 'Microsoft']

このように結果が異なります。この場合はcopied_listに変更が反映されていません。

両オブジェクトの同一性を確かめましょう。

original_list is copied_list

結果は、

False

となり、両者は違うオブジェクトとわかります。

結果まとめ

以上のことを簡単にまとめると、

変更の方法コピーされたオブジェクトへの影響
appendを使った変更自動的に変更される
代入文を使った変更自動的に変更されない

となります。

このようにリストの構成に変更を加えるとき、appendか代入文のどちらを使うかによって処理が変わるので、その点を意識していないとエラーにハマることが考えられます。

最速でプログラミングをマスターするならTechAcademy [テックアカデミー] 【PR】がオススメです。

マイペースで学ぶなら世界最大級の動画学習サイトUdemyがオススメです。セールで安く買える講座も多数!

愛を分かち合いましょう