2012-01-26 114 views
3

我在蟒蛇看起来写了如下代码:奇怪的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}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}] 

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

+0

它是惊人的,我们多长时间得到同样的问题了微妙的变化......除了标志事情重复,我开始觉得我们需要有一种方法来创建每个标签的FAQ。 –

回答

12

当你做到以下几点:

maplist=[{}]*11 

你结束了十所一个引用同一个字典。这意味着当你修改一本字典时,它们都显得有变化。

要修复,替换该行:

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

需要注意的是,由于0是标量,下一行是好的,因为它是:

mylist=[0]*11 
+0

Ohh第一次遇到这个。 python是否有特定的原因,是否有用? –

+0

@Piyush这只是*操作符在列表中工作的结果。请参阅[本答案](http://stackoverflow.com/a/8240157/566644)以获得更深入的解释。 –

3

问题是,当你键入

maplist=[{}]*11 

您正在创建11个引用列表,其中包含相同的dict。只有一个字典被创建。

要创建11个不同的字典,你可以做这样的事情:

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