0

我刚花了一个小时就遇到了以下挫败感,并且

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

谢谢

4

2 回答 2

4

因为你把同样的dict6次。[{}]*6不会复制/深度复制原始字典,而只会复制对它的引用。如果您想要 6 个单独的 dict,请使用循环/列表理解,例如

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

在python 文档中查看更多解释

于 2012-04-26T21:12:02.197 回答
1

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

在第一种情况下:

>>> e = [{}]*6

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

在第二种情况下:

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

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

于 2012-04-26T21:14:57.690 回答