今天早上我遇到了这个奇怪的问题:
>>> l = ['a', 'b', 'c']
>>> dict = dict.fromkeys(l, [])
>>> dict['a'] += [1]
>>> dict
{'a': [1], 'c': [1], 'b': [1]}
我无法解释为什么会发生这种情况?
答案 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]}