You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python dict.fromkeys追加值为何所有键对应列表同步修改

问题根因

dict.fromkeys()方法接收的第二个参数是一个提前创建好的对象,方法执行时会把所有字典键的值都指向同一个对象引用,不会为每个键单独生成新的对象。
你代码里传给fromkeys的空列表[]在方法调用时仅被创建了1次,key1和key2对应的value本质都是这同一个列表的引用,内存地址完全一致。不管你通过哪个键操作这个列表,修改的都是同一份数据,所以执行append后两个键对应的列表都会出现新增的"test"。

你可以用下面的代码验证引用相同的逻辑:

list_f = ["key1", "key2"]
dic_f = dict.fromkeys(list_f, [])
# 打印两个值的内存ID
print(id(dic_f["key1"]))
print(id(dic_f["key2"]))

执行后会发现两个ID完全相同,证明二者指向同一个列表对象。

正确写法

要实现每个键绑定独立空列表的效果,不要直接给fromkeys传入列表这类可变对象作为默认值,用字典推导式即可——推导式遍历每个键时,都会单独为当前键创建一个全新的空列表,各个键对应的值互不影响:

list_f = ["key1", "key2"]
# 为每个键生成独立的空列表
dic_f = {key: [] for key in list_f}
dic_f["key1"].append("test")
print(dic_f)

执行后得到的输出完全符合预期:

{'key1': ['test'], 'key2': []}

注意:所有可变类型(列表、字典、自定义实例等)作为dict.fromkeys()的第二个参数时都会出现这个引用共用的问题;不可变类型(数字、字符串、不可变元组)本身不支持原地修改,不会出现这类连带修改的异常,可以直接作为默认值传入。

内容的提问来源于stack exchange,提问作者zimon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 14:42:33