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

Python用dict.fromkeys设空列表为值修改单键所有值同步变更原因

运行结果异常的原因

dict.fromkeys()的设计逻辑是:当传入的第二个参数为默认值时,只会生成一次该默认值对象,然后将所有键都绑定到这个对象的引用上,不会为每个键单独创建新的默认值实例。

你代码中传入的空列表[]是可变对象,因此字典d中所有键1、2、3、4指向的是内存中同一个列表对象。当你执行d[1].append(777)时,修改的是这个公共的列表对象,所以通过所有键访问这个列表时都会看到修改后的结果,最终输出所有键对应的值都是[777]。

实现预期效果的正确写法

要让每个键对应独立的空列表,推荐使用以下两种写法:

  • 字典推导式写法(最直观,适合已知所有键的场景)
n = [1,2,3,4]
d = {k: [] for k in n}
d[1].append(777)
print(d) # 输出:{1: [777], 2: [], 3: [], 4: []}
  • collections.defaultdict写法(适合后续需要动态新增键的场景)
from collections import defaultdict
d = defaultdict(list)
# 可以提前初始化所有键
n = [1,2,3,4]
for k in n:
    d[k] # 访问不存在的键时会自动绑定独立的空列表

d[1].append(777)
print(d) # 输出:defaultdict(<class 'list'>, {1: [777], 2: [], 3: [], 4: []})
# 如需转换为普通字典,调用dict(d)即可

注意:只有不可变对象(整数、字符串、元组等)适合作为dict.fromkeys()的默认值,可变对象(列表、字典、集合等)使用该方法设置默认值都会出现所有键共享同一个对象的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:39:00