Python 的 dict.fromkeys 的坑
3月 10, 2023
目前使用到 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
的参数里设置一个引用类型的对象,不然的话属于高危操作了,使用时需要格外注意。