首页  >  文章  >  后端开发  >  为什么带有可变对象的“fromkeys”会在 Python 字典中创建共享值?

为什么带有可变对象的“fromkeys”会在 Python 字典中创建共享值?

Patricia Arquette
Patricia Arquette原创
2024-10-26 11:05:29258浏览

 Why Does `fromkeys` with Mutable Objects Create Shared Values in Python Dictionaries?

使用 fromkeys 和可变对象创建字典:令人惊讶的转变

Python 中的 fromkeys 方法是从键序列,全部映射到指定值。但是,当使用可变对象作为值时,可能会发生意外行为。

好奇心

考虑 Python 2.6 和 3.2 中的以下示例:

<code class="python">xs = dict.fromkeys(range(2), [])
xs[0].append(1)
print(xs)</code>

令我们惊讶的是,修改与第一个键 ([0]) 关联的列表也会影响与第二个键 ([1]) 关联的列表。这可能会令人费解,因为我们希望每个键都有自己独立的值。

启示

这种奇怪行为的原因在于 fromkeys 方法创建一个包含对同一可变对象的引用的新字典,而不是创建单独的副本。换句话说,所有字典条目都指向同一个底层可变对象。

解决方案

为了避免这个问题,我们可以使用字典推导式,它创建一个新的每个字典键的列表:

<code class="python">xs = {i: [] for i in range(2)}
xs[0].append(1)
print(xs)</code>

在 Python 2.6 及更早版本中,我们可以通过使用带有生成器表达式的 dict() 来实现类似的行为:

<code class="python">xs = dict((i, []) for i in range(2))</code>

此替代方法还会创建每个字典键都有单独的列表。

结论

了解使用可变对象创建字典的细微差别对于防止 Python 代码中的意外行为和维护数据完整性至关重要。通过选择适当的方法,我们可以确保字典条目被正确隔离并避免不必要的副作用。

以上是为什么带有可变对象的“fromkeys”会在 Python 字典中创建共享值?的详细内容。更多信息请关注PHP中文网其他相关文章!

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