首页  >  文章  >  后端开发  >  为什么 `dict.fromkeys()` 在 Python 中创建共享可变对象?

为什么 `dict.fromkeys()` 在 Python 中创建共享可变对象?

Patricia Arquette
Patricia Arquette原创
2024-10-25 16:27:02148浏览

 Why does `dict.fromkeys()` create shared mutable objects in Python?

字典创建和可变对象:fromkeys 的令人惊讶的行为

在 Python 中使用 dict.fromkeys() 创建字典时,可能会出现意外情况当使用可变对象作为值时就会出现这种情况。考虑以下示例:

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

尽管创建了两个单独的列表对象作为字典键 0 和 1 的值,但将元素添加到索引 0 处的列表也会将其添加到索引 1 处的列表。发生这种情况是因为 fromkeys 将每个键绑定到可变对象的同一引用,从而导致共享修改。

相反,Python 3.2 中的字典推导式表现出不同的行为:

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

这里,每个key 绑定到一个不同的列表对象。将元素追加到索引 0 处的列表不会影响索引 1 处的列表。

为什么会有差异?

可以通过考虑以下方式来理解 fromkeys 的行为:以下等效代码:

<code class="python">a = []
xs = dict.fromkeys(range(2), a)</code>

结果字典中的每个键都引用相同的对象,从而导致观察到的共享修改。

为每个键实现不同可变对象的所需行为,使用字典推导式,或者,对于没有字典推导式的 Python 2.6 及更早版本,将 dict() 与生成器表达式一起使用:

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

以上是为什么 `dict.fromkeys()` 在 Python 中创建共享可变对象?的详细内容。更多信息请关注PHP中文网其他相关文章!

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