字典创建和可变对象: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