なぜ起こるかという質問ですね。
pythonの世界では全てがオブジェクトです。
d = {}
を実行したとき、まず辞書のクラスであるdictが子供を作ります。子供のことをインスタンスと呼んでいます。クラスとかインスタンスのことをまとめてオブジェクトと呼びます。
また、= によって、作られた辞書のインスタンスがdという名前に結びつけられます。
オブジェクトはたくさんあって区別することが必要になるので、それを区別するためにidというものを持っています。idを調べるには、id(x)という関数を使います。
dと結びつけられている辞書インスタンスのidを調べてみましょう。
python
1>>> d = {}
2>>> print(d)
3{}
4>>> print(id(d))
52713329953536
もう一度同じ事をやってみると、
python
1>>> d = {}
2>>> print(d)
3{}
4>>> print(id(d))
52713329991488
id(d)が変わっています。これは最初に作られたdictのインスタンスと二回目に作られたdictのインスタンスが別のものだという意味です。
では、空のリストを作って、そこにdを二回追加したあとでそのidを調べてみましょう。
python
1>>> lst = []
2>>> lst.append(d)
3>>> lst.append(d)
4>>> print(id(lst[0]))
52713329991488
6>>> print(id(lst[1]))
72713329991488
どちらも2713329991488で同じです。
lst[0]["A"] = True という文は、2713329991488というidを持つ辞書インスタンスの"A"にTrueをというオブジェクトを結びつけなさいという意味です。
lst[1]["A"]を表示しようとすると、2713329991488というidを持つ辞書インスタンスの"A"に結びつけられたオブジェクトであるTrueが表示されます。
つまり、lst[0]とlst[1]の一方を変更するともう一方も変更されるということになります。
どうすれば、これを回避できるかは_whitecat_22さんが書かれています。
もっと短く書きたければ、以下の書き方もあります。
python
1>>> lst = [{}, {}, {}, {}]
2>>> print(lst)
3[{}, {}, {}, {}]
最初に書いたように、{}というのが複数回書かれていると、それぞれに違うidを持つ辞書インスタンスが作られますのでMedakaNoGakkoさんのやりたいことは実現できます。
公式ドキュメントのFAQにもこれに近いFAQが書かれていますので、読んでみるといいかもしれません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/15 13:38