为何外观完全相同的两个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
相关产品推荐
相关产品推荐

