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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:51:03