Python 的 dict.fromkeys 的坑

Python 的 dict.fromkeys 的坑

Mar 10, 2023
Python

目前使用到 dict.fromkeys 方法主要有两个场景:一个是按照数组的原有顺序去重,另一个就是正常的根据 keys 构建一个 dict,这里讨论的是第二种情况。

下面这个例子:

l = ["foo", "bar"]
v = {"age": 0}

d = dict.fromkeys(l, v)

d["foo"]["age"] += 1
d["bar"]["age"] += 1

d["foo"]["age"]

由于 Python 在 v 处存储的是引用而不是值的原因,故 d["foo"]["age"] 最终的值为 2,如果用 id() 方法打印两个对象的地址,可以发现是同一个值。

print(id(d["foo"]["age"]))
print(id(d["bar"]["age"]))

# 140648770627920
# 140648770627920

要解决这个问题,可以适当改一下写法,不使用 fromkeys() 方法初始化类似结构或者避免在 fromkeys 的参数里设置一个引用类型的对象,不然的话属于高危操作了,使用时需要格外注意。

本文共 225 字,上次修改于 Apr 8, 2023,以 CC 署名-非商业性使用-禁止演绎 4.0 国际 协议进行许可。

相关文章

» 使用 Django 查询数据库的分表

» Django 中 N+1 查询问题优化

» Django 的中间件执行顺序

» Django 的软删除设计

» 浅谈 Django-REST-Framework 的设计与源码