初始化python中的字典列表时出现奇怪的索引行为

时间:2012-04-26 21:10:32

标签: python list dictionary

我只花了一个小时就遇到了以下挫折感,

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初始化字典列表时,尝试通过列表中的索引修改单个字典会修改所有字典。而明确初始化

由于

2 个答案:

答案 0 :(得分:4)

因为你将dict放置了6次。 [{}]*6不会复制/深入查看原始字典,而只会复制/深入查看它。如果你想要6个单独的dict,请使用循环/列表理解,例如

e = [{} for i in range(6)] 

python doc

中查看更多解释

答案 1 :(得分:1)

答案是:可变性。这并不奇怪。

在第一种情况下:

>>> e = [{}]*6

您从重复6次字典创建一个列表。如果更改其中一个元素,则更改其他元素(至少看起来如此,因为实际上这些“其他”元素是相同的元素)。

在第二种情况下:

>>> e = [{}, {}, {}, {}, {}, {}]

您从 6个不同的词典创建了一个列表,因此更改一个列表不会影响其他词典。