首页  >  文章  >  后端开发  >  为什么带有可变值的 Python 的 `dict.fromkeys` 会导致意外行为?

为什么带有可变值的 Python 的 `dict.fromkeys` 会导致意外行为?

Patricia Arquette
Patricia Arquette原创
2024-10-25 15:56:02248浏览

Why Does Python's `dict.fromkeys` With Mutable Values Cause Unexpected Behavior?

使用 fromkeys 和可变对象创建字典:意外的惊喜

在 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 行为的原因

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn