1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

list初期化時の落とし穴

Posted at

任意個の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日潰した

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?