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

Patricia Arquette
发布: 2024-10-25 16:27:02
原创
157 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!