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
相关产品推荐
相关产品推荐

