2014-08-28 212 views
0

我遇到这个奇怪的问题今天早上来的?怪异蟒蛇字典augement分配

+4

无法复制。 – 2014-08-28 02:26:07

+2

我不认为你在发布你实际使用的代码。 – BrenBarn 2014-08-28 02:27:42

+0

对不起,我用了dict.fromkeys函数,我想我正在关闭原因 – yorua007 2014-08-28 02:29:19

回答

4

dict.fromkeys创建了一大堆引用的列表。换句话说,d['a']d['b']等当你做+=你扩大名单到位,所以在所有列表中看到修改 - 毕竟,他们是相同的列表。

>>> l = ['a', 'b', 'c'] 
>>> d = dict.fromkeys(l, []) 
>>> d 
{'a': [], 'c': [], 'b': []} 
>>> print [id(v) for v in d.values()] # Note, they all have the same ID -- They're the same. 
[4385936016, 4385936016, 4385936016] 
>>> d['a'] += [1] 
>>> d 
{'a': [1], 'c': [1], 'b': [1]} 

正如在评论中指出,我其实并没有告诉你如何解决这个问题。如果你想初始化是可变值的情况下键的字典,你可以使用字典解析:

d = {key: [] for key in l} 

或者,如果你坚持使用旧版本的Python(python2.7之前)你传递产生2元组的字典构造一个迭代:

d = dict((key, []) for key in l) 

注意,有以及其他变体是了解(colections.defaultdict,常规字典子与重写__missing__)是有用的。其中每个都有稍微不同的行为,我会解释here。然而,这应该是足以让你去暂且...

+0

海报试图做的正确表示法是'dict = {key:[] for key in l}',为每个键设置自己的唯一列表,我不想在发布新的答案时你已经钉上了它。 – user2085282 2014-08-28 02:36:24

+0

@ user2085282 - 好点。我想我应该提供一个替代方案。 。 。 – mgilson 2014-08-28 05:14:18

0

您可能会感兴趣的collections.defaultdict:

In [66]: d = collections.defaultdict(list) 

In [67]: d['a'] += [1] 

In [68]: d 
Out[68]: defaultdict(<class 'list'>, {'a': [1]}) 

In [69]: dict(d) 
Out[69]: {'a': [1]} 

In [70]: d['b'] 
Out[70]: [] 

In [71]: dict(d) 
Out[71]: {'b': [], 'a': [1]} 

In [72]: d['c'] 
Out[72]: [] 

In [73]: dict(d) 
Out[73]: {'b': [], 'c': [], 'a': [1]}