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

Python嵌套字典赋值异常:为何不同长度字典赋值后结果一致?

问题:字典嵌套赋值后结果不符合预期

以下是问题代码:

main = ['S1', 'S2']
my_dict = dict.fromkeys(main, {})

CHANNELS_S1 = {'CH1': {'Unit': 'A', 'RANGE': '0.2'},
               'CH2': {'Unit': 'B', 'RANGE': '0.3'},
               'CH3': {'Unit': 'C', 'RANGE': '0.4'}}

CHANNELS_S2 = {'CH1': {'Unit': 'X', 'RANGE': '.2'}}


my_dict['S1']['CHANNELS'] = CHANNELS_S1
my_dict['S2']['CHANNELS'] = CHANNELS_S2

运行后实际结果:

{'S1': {'CHANNELS': {'CH1': {'Unit': 'X', 'RANGE': '.2'}}},
 'S2': {'CHANNELS': {'CH1': {'Unit': 'X', 'RANGE': '.2'}}}}

期望结果:

{'S1': {'CHANNELS': {'CH1': {'Unit': 'A', 'RANGE': '0.2'},
                     'CH2': {'Unit': 'B', 'RANGE': '0.3'},
                     'CH3': {'Unit': 'C', 'RANGE': '0.4'}}},
 'S2': {'CHANNELS': {'CH1': {'Unit': 'X', 'RANGE': '.2'}}}}

原因分析

dict.fromkeys(main, {}) 会为所有键创建同一个空字典的引用,而非每个键对应独立的空字典。当你执行my_dict['S1']['CHANNELS'] = CHANNELS_S1时,是给这个共享字典添加键值对;后续执行my_dict['S2']['CHANNELS'] = CHANNELS_S2时,会覆盖共享字典里的CHANNELS值,最终所有键指向的都是最后修改的那个字典。

解决方法

方法1:使用字典推导式生成独立字典

用字典推导式为每个键创建全新的空字典,避免引用共享:

main = ['S1', 'S2']
my_dict = {key: {} for key in main}

CHANNELS_S1 = {'CH1': {'Unit': 'A', 'RANGE': '0.2'},
               'CH2': {'Unit': 'B', 'RANGE': '0.3'},
               'CH3': {'Unit': 'C', 'RANGE': '0.4'}}

CHANNELS_S2 = {'CH1': {'Unit': 'X', 'RANGE': '.2'}}

my_dict['S1']['CHANNELS'] = CHANNELS_S1
my_dict['S2']['CHANNELS'] = CHANNELS_S2

方法2:逐个初始化每个键的字典

手动为每个键分配独立的空字典:

main = ['S1', 'S2']
my_dict = {}
my_dict['S1'] = {}
my_dict['S2'] = {}

# 后续赋值代码同上

方法3:直接创建包含完整配置的字典

如果提前知道所有配置,可以一步到位创建目标字典,避免后续嵌套赋值:

CHANNELS_S1 = {'CH1': {'Unit': 'A', 'RANGE': '0.2'},
               'CH2': {'Unit': 'B', 'RANGE': '0.3'},
               'CH3': {'Unit': 'C', 'RANGE': '0.4'}}

CHANNELS_S2 = {'CH1': {'Unit': 'X', 'RANGE': '.2'}}

my_dict = {
    'S1': {'CHANNELS': CHANNELS_S1},
    'S2': {'CHANNELS': CHANNELS_S2}
}

以上三种方法都能得到期望的结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 14:20:19