Python 的 dict.fromkeys 的坑
3月 10, 2023
注意:此文章已超过 1 年未更新,部分信息可能已经过时。
目前使用到 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 的参数里设置一个引用类型的对象,不然的话属于高危操作了,使用时需要格外注意。