在 Python 2.6 和 3.2 中,具有可变对象的 dict.fromkeys 的行为可能会令人惊讶。当使用列表作为值时,修改字典中的一个条目会影响所有其他条目,如下所示:
>>> xs = dict.fromkeys(range(2), []) >>> xs {0: [], 1: []} >>> xs[0].append(1) >>> xs {0: [1], 1: [1]}
但是,Python 3.2 的 dict 推导式不会发生这种行为:
>>> xs = {i:[] for i in range(2)} >>> xs {0: [], 1: []} >>> xs[0].append(1) >>> xs {0: [1], 1: []}
fromkeys 行为的明显原因是生成的字典中的每个条目都引用相同的对象。通过一项修改对象会影响所有其他项。这可以通过手动创建字典来澄清:
>>> a = [] >>> xs = dict.fromkeys(range(2), a)
这表明字典条目都引用同一个对象:
>>> xs[0] is a and xs[1] is a True
要避免这种行为,请使用 dict 推导式,或者,如果使用 Python 2.6 或更早版本,请使用带有生成器表达式的 dict:
xs = dict((i, []) for i in range(2))
以上是为什么带有可变值的 Python 的 `dict.fromkeys` 会导致意外行为?的详细内容。更多信息请关注PHP中文网其他相关文章!