奇怪的python dict增强了赋值

时间:2014-08-28 02:24:25

标签: python dictionary

今天早上我遇到了这个奇怪的问题:

>>> l = ['a', 'b', 'c']
>>> dict = dict.fromkeys(l, [])
>>> dict['a'] += [1]
>>> dict
{'a': [1], 'c': [1], 'b': [1]}

我无法解释为什么会发生这种情况?

2 个答案:

答案 0 :(得分: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之前),则将一个迭代器传递给dict构造函数:

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

请注意,还有其他变体可用于了解(colections.defaultdict,一个带有重写__missing__的常规dict子类。其中每个都有不同的行为,我解释here。但是,这应该足以让你暂时离开...

答案 1 :(得分: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]}