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

为何外观完全相同的两个Python嵌套字典行为表现不一致?

问题原因:dict.fromkeys的共享引用特性

核心原理

dict.fromkeys() 方法传入可变对象作为默认值时,会为所有键绑定同一个可变对象的内存引用,而非为每个键单独创建独立的新对象,这就是你遇到异常的根本原因。

你生成daysGenerated的逻辑大概率是这样的:

# 生成小时初始计数模板
hour_count = dict.fromkeys(range(24), 0)
# 用模板生成星期维度的嵌套字典
daysGenerated = dict.fromkeys(["周一", "周二", "周三", "周四", "周五", "周六", "周日"], hour_count)

这种写法下,daysGenerated里7个星期对应的小时字典,本质上都是同一个hour_count对象的别名,你修改任意一天某小时的数值,都是在修改这个共享的模板对象,自然所有天的对应小时数值会同步变动。

而你手动逐行定义的daysPrebuilt,每个星期对应的小时字典都是独立创建的新对象,内存地址完全不同,修改时只会作用于目标子字典,所以表现符合预期。你可以通过打印子字典的id验证这一点:

# 以下输出的id完全相同,证明是同一个对象
print(id(daysGenerated["周一"]), id(daysGenerated["周二"]))
# 以下输出的id完全不同,证明是独立对象
print(id(daysPrebuilt["周一"]), id(daysPrebuilt["周二"]))

正确生成方案

不要用dict.fromkeys生成嵌套可变对象结构,改用字典推导式为每个星期键单独生成独立的小时计数字典:

# 正确写法,每个day对应独立的小时字典
daysFixed = {
    day: {hour: 0 for hour in range(24)}
    for day in ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:15:03