您的Python 2.6示例与以下示例等效,这可能有助于阐明:
>>> a = []>>> xs = dict.fromkeys(range(2), a)
结果字典中的每个条目都将引用同一对象。如您所见,使该对象发生变异的效果将在每个dict条目中可见,因为它是一个对象。
>>> xs[0] is a and xs[1] is aTrue
使用dict理解,或者如果您使用Python 2.6或更早版本并且没有字典理解,则可以通过使用dict()生成器表达式来获得dict理解行为:
xs = dict((i, []) for i in range(2))解决方法
我在Python 2.6和3.2中遇到了让我感到惊讶的行为:
>>> xs = dict.fromkeys(range(2),[])>>> xs{0: [],1: []}>>> xs[0].append(1)>>> xs{0: [1],1: [1]}
但是,dict3.2中的理解显示出更礼貌的举止:
>>> xs = {i:[] for i in range(2)}>>> xs{0: [],1: []}>>>
为什么会fromkeys这样?