我只花了一个小时就遇到了以下挫折感,
a)想要发布它以防其他人有同样的问题,并且 b)我很好奇这种行为的基础。
$ e = [{}]*6
$ e
[{}, {}, {}, {}, {}, {}]
$ e[0]['green'] = 'blue'
$ e
[{'green': 'blue'}, {'green': 'blue'}, {'green': 'blue'}, {'green': 'blue'}, {'green': 'blue'}, {'green': 'blue'}]
$ e = [{}, {}, {}, {}, {}, {}]
$ e
[{}, {}, {}, {}, {}, {}]
$ e[0]['green'] = 'blue'
$ e
[{'green': 'blue'}, {}, {}, {}, {}, {}]
基本上,问题是当使用[{}] * int初始化字典列表时,尝试通过列表中的索引修改单个字典会修改所有字典。而明确初始化
由于
答案 0 :(得分:4)
因为你将dict
放置了6次。 [{}]*6
不会复制/深入查看原始字典,而只会复制/深入查看它。如果你想要6个单独的dict,请使用循环/列表理解,例如
e = [{} for i in range(6)]
中查看更多解释
答案 1 :(得分:1)
答案是:可变性。这并不奇怪。
在第一种情况下:
>>> e = [{}]*6
您从重复6次字典创建一个列表。如果更改其中一个元素,则更改其他元素(至少看起来如此,因为实际上这些“其他”元素是相同的元素)。
在第二种情况下:
>>> e = [{}, {}, {}, {}, {}, {}]
您从 6个不同的词典创建了一个列表,因此更改一个列表不会影响其他词典。