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

遍历字典赋值类实例时值被覆盖,求解决方案

问题原因与解决方案:字典中类实例被重复覆盖

你的核心问题是没有创建类的实例,而是直接操作类本身:

# 错误:只是引用类本身,没有创建实例
results_data = LoadResultsData

这行代码并没有生成LoadResultsData的新实例,只是把类对象赋值给了results_data变量。循环中你修改的是类的静态属性,而非实例属性——所有字典条目最终指向的都是同一个类对象,所以最后所有值都会被最后一次循环的赋值覆盖。

修正方案

把类引用改为实例化操作(加括号),每次循环创建一个全新的类实例:

# Initialize dict with keys but no values
results = dict.fromkeys(rooms)

for room_id in rooms: # rooms is a list of strings
    # 正确:创建类的新实例
    results_data = LoadResultsData()

    # 为当前实例的属性赋值
    results_data.sens_total = np.array([1, 2, 3, 4, 5])
    results_data.sens_lighting = np.array([2, 2, 3, 4, 5])
    results_data.sens_equipment = np.array([3, 2, 3, 4, 5])
    results_data.sens_people = np.array([4, 2, 3, 4, 5])

    # 将新实例存入字典
    results[room_id] = results_data

为什么复制/深复制没用?

你之前尝试的复制操作都是针对类对象本身,而类是单例的——无论怎么复制,指向的都是同一个类。只有创建新的实例,每个条目才会对应独立的对象,修改时不会互相覆盖。

进阶优化(可选)

如果LoadResultsData类支持初始化参数,可以把属性赋值逻辑放到__init__方法里,让代码更规范:

class LoadResultsData:
    def __init__(self, sens_total, sens_lighting, sens_equipment, sens_people):
        self.sens_total = sens_total
        self.sens_lighting = sens_lighting
        self.sens_equipment = sens_equipment
        self.sens_people = sens_people

# 循环中直接传参实例化
results_data = LoadResultsData(
    np.array([1,2,3,4,5]),
    np.array([2,2,3,4,5]),
    np.array([3,2,3,4,5]),
    np.array([4,2,3,4,5])
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:43:17