list初期化時の落とし穴


任意個のdictが入ったlistを初期化してえなぁ

どうやったらいいかな?
とりあえずこうやってみるかな

>> hoge = [{}]*5
>> hoge
 [{},{},{},{},{}]

できてるっぽいな?
試しになんか代入してみるかな

>>> hoge[0]["huga"] = 1919
>>> hoge
[{'huga': 1919}, {'huga': 1919}, {'huga': 1919}, {'huga': 1919}, {'huga': 1919}]

は?

なぜこうなったか

単に同じオブジェクトの参照が複製されてlistに格納されたのでこういうことになっている
つまり全部同じdictということ

例えばこうやると別のdictが入るので問題はない

>>> hoge[0] = {}
>>> hoge
[{}, {'huga': 1919}, {'huga': 1919}, {'huga': 1919}, {'huga': 1919}]

別のdictを生成して代入しているのでまあこうなる

そもそも初期化する時に別のdict生成して入れたいんだが???

そういうときは内包表記とか使ってlistを生成してやれば良い

>>> hoge = [{"key":i} for i in range(5)]
>>> hoge
[{'key': 0}, {'key': 1}, {'key': 2}, {'key': 3}, {'key': 4}]

内部的にはforをぶん回して都度dictを生成しているので当然大丈夫

終わり

こんな感じのミスをして1日潰した