遍历字典赋值类实例时值被覆盖,求解决方案
问题原因与解决方案:字典中类实例被重复覆盖
你的核心问题是没有创建类的实例,而是直接操作类本身:
# 错误:只是引用类本身,没有创建实例 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
相关产品推荐
相关产品推荐

