Python嵌套字典修改时voltage_start重复追加V但bank_1_bus_voltage正常原因查询
问题原因分析
核心差异是Python中可变对象和不可变对象的引用逻辑不同,两个字段的赋值逻辑完全不一样:
bank_1_bus_voltage表现正常的原因:get_unit_data中该字段取的是模型存储的float类型值,float属于不可变对象,返回的是值的拷贝。在get函数中执行unit_data['bank_1_bus_voltage'] = str(...) + "V"时,只是修改了当前返回的unit_data字典对应键的指向,完全不会改动模型中存储的原始数值,所以每次调用get_unit_data拿到的都是原始的0.0,追加V的操作只会执行一次,数值始终正常。voltage_start重复追加V的原因:get_unit_data中bank_1_battery_voltages是直接把模型里的battery_voltage_dict字典对象的引用赋值给了返回字典,字典属于可变对象。你在get函数中修改unit_data['bank_1_battery_voltages'][1]['voltage_start']时,本质是直接修改了模型中存储的原始字典的内容,不需要重新赋值就会同步到原始数据。
下一次调用get_unit_data时,拿到的voltage_start已经是上次修改后带V的字符串,再次执行str(...) + "V"就会多追加一个V,多次调用就会出现0.0VVVVV的问题。
修复方案
- 方案1:返回嵌套结构时做深拷贝,避免直接返回模型中可变对象的引用,修改
get_unit_data函数即可:
import copy def get_unit_data(self, unit): unit_data_dict = { 'bank_1_bus_voltage': self.model.unit_dict[unit].bank_dict[1].bus_voltage, # 对嵌套字典做深拷贝,返回独立的副本,修改不会影响原始模型数据 'bank_1_battery_voltages': copy.deepcopy(self.model.unit_dict[unit].bank_dict[1].battery_voltage_dict), } return unit_data_dict
- 方案2:修改
get函数的拼接逻辑,追加V前先判断值的类型,只对数值类型做拼接操作,避免重复给字符串加V。
内容的提问来源于stack exchange,提问作者Lemonade
相关产品推荐
相关产品推荐

