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

在python中初始化字典列表时出现奇怪的索引行为,python,list,dictionary,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 = [

我只是花了一个小时来忍受以下的挫折

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


谢谢

,因为您将同一个
指令放了6次
[{}]*6
不会复制/深度复制原始dict,而只复制对它的引用。如果你想要6个单独的dict,使用循环/列表理解,例如

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

请参阅

中的更多说明,因为您要将相同的
指令放6次
[{}]*6
不会复制/深度复制原始dict,而只复制对它的引用。如果你想要6个单独的dict,使用循环/列表理解,例如

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

参见

中的更多解释答案是:易变性。这并不奇怪

在第一种情况下:

>>> e = [{}]*6
您可以从一个重复6次的词典创建一个列表。如果您更改其中一个元素,您也会更改其他元素(至少看起来是这样的,因为实际上这些“其他”元素是相同的元素)

在第二种情况下:

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

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

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

在第一种情况下:

>>> e = [{}]*6
您可以从一个重复6次的词典创建一个列表。如果您更改其中一个元素,您也会更改其他元素(至少看起来是这样的,因为实际上这些“其他”元素是相同的元素)

在第二种情况下:

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

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

没错!更详细地说,当您在Python中执行
[X]*N
时,您所说的就是在列表中为X提供N个引用(其中X可以是任何可变类型)。他们最终都指向同一个东西,改变其中任何一个最终都会改变所有的东西。没错!更详细地说,当您在Python中执行
[X]*N
时,您所说的就是在列表中为X提供N个引用(其中X可以是任何可变类型)。它们最终都指向同一个对象,更改其中任何一个都会更改所有对象。此链接也可能有帮助此链接也可能有帮助