”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么 `dict.fromkeys()` 在 Python 中创建共享可变对象?

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

发布于2024-11-08
浏览:449

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

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

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

xs = dict.fromkeys(range(2), [])
xs[0].append(1)
print(xs)

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

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

xs = {i: [] for i in range(2)}
xs[0].append(1)
print(xs)

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

为什么有差异?

fromkeys 的行为可以通过考虑以下等效代码:

a = []
xs = dict.fromkeys(range(2), a)

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

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

xs = dict((i, []) for i in range(2))
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3