奇怪的Python行为

时间:2012-01-26 08:22:15

标签: python

我在python中编写了一个代码,如下所示:

maplist=[{}]*11
mylist=[0]*11
maplist[0]['this']=1
print maplist

当我打印maplist时,输出为:

[{'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}, {'this': 1}]

预期是:

[{'this': 1}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}]

而不是只有列表的第一个元素应该在地图中有这个键。是什么导致了这个问题?

2 个答案:

答案 0 :(得分:12)

执行以下操作时:

maplist=[{}]*11

你最终得到11个对同一字典的引用。这意味着当您修改一个字典时,它们似乎都会发生变化。

要修复,请将该行替换为:

maplist=[{} for in xrange(11)]

请注意,由于0是一个标量,下一行很好,因为它是:

mylist=[0]*11

答案 1 :(得分:3)

问题是当你输入

maplist=[{}]*11

您正在创建一个包含对同一dict的11个引用的列表。只创建一个字典。

要创建11个单独的词典,您可以执行以下操作:

>>> maplist = [{} for i in range(11)]
>>> maplist[0]['this'] = 1
>>> maplist
[{'this': 1}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}]