Python中如何复制嵌套字典避免别名关联导致的值同步修改问题
你遇到的现象本质是Python中可变对象的引用传递机制导致的:你定义的specificSensorInfo是字典类型(可变对象),直接赋值给多个键时,所有位置都指向同一个内存地址的对象,修改任意位置的内容都会同步到所有引用该对象的位置。
以下两种方案都可以保留字典[]操作符的使用习惯,不需要引入类实现需求:
方案1:使用字典浅拷贝
你的内层字典初始值都是不可变类型,直接调用dict.copy()生成独立副本即可满足需求,修改后的构建代码如下:
# 内层字典模板 specificSensorInfo = { "value": None, "status": None } # 中层字典每个键对应一个独立的字典副本 board1_sensors = { 13: specificSensorInfo.copy(), # "AUX +3.3V Vol" 14: specificSensorInfo.copy(), # "MCU_Temperature" 15: specificSensorInfo.copy(), # "AUX +3.3V Temp" } board2_sensors = { 13: specificSensorInfo.copy(), # "AUX +3.3V Vol" 14: specificSensorInfo.copy(), # "MCU_Temperature" 15: specificSensorInfo.copy(), # "AUX +3.3V Temp" } # 最外层字典 all_sensor_info = {'B1': board1_sensors, 'B2': board2_sensors}
方案2:使用工厂函数生成内层字典
如果后续内层字典字段需要频繁调整、或者需要批量生成大量内层字典,可以写一个简单的工厂函数,避免每次手动调用copy,代码更易维护:
# 工厂函数,每次调用返回一个独立的内层字典实例 def get_sensor_info(): return { "value": None, "status": None } # 构建中层字典时直接调用函数生成独立实例 board1_sensors = { 13: get_sensor_info(), 14: get_sensor_info(), 15: get_sensor_info() } board2_sensors = { 13: get_sensor_info(), 14: get_sensor_info(), 15: get_sensor_info() } all_sensor_info = {'B1': board1_sensors, 'B2': board2_sensors}
两种方案修改完成后,你原本的赋值操作all_sensor_info['B1'][13]['value'] = 10、all_sensor_info['B2'][14]['status'] = 'OK'只会修改对应位置的字典值,不会出现全局同步修改的问题。
内容的提问来源于stack exchange,提问作者timsweeney7
相关产品推荐
相关产品推荐

