Python列表append操作导致对象location参数异常问题求助
问题排查与修复方案
核心问题原因
- 可变默认参数的共享特性
Python中,可变对象(比如列表)作为函数默认参数时,会在函数定义阶段就被创建,而非每次调用函数时重新生成。你的WaterDispenser.__init__方法里,location: list=[-1, -1]属于这种情况——所有WaterDispenser实例默认会共享同一个列表对象。
后续Load方法中直接修改这个共享列表的元素(self.location[0] = ...),导致所有实例的location指向同一块内存地址的列表,最后一次修改会覆盖之前所有实例的取值。
修复步骤
1. 修正__init__方法,避免可变默认参数
将默认参数改为None,在方法内部创建新列表,确保每个实例拥有独立的location:
class WaterDispenser(): def __init__(self, id: int = -1, status: bool = False, location: list=None) -> None: self.id = id self.status = status # 无传入location则创建新列表;传入则复制避免外部修改影响实例 self.location = location.copy() if location is not None else [-1, -1] # 其余方法保持不变或按下面优化
2. 优化Load方法(可选,更严谨)
直接给self.location赋值新列表,替代修改原有元素的方式,逻辑更直观:
def Load(self, object: dict) -> None: """Loads the json dictionary in memory Parameters ---------- object : dict, required The json file with the properties of the dispenser Returns ------- None """ self.id = object["id"] self.status = object["status"] # 直接赋值新列表,确保实例持有独立对象 self.location = object["location"].copy() return None
修复后验证效果
修改代码后重新运行main.py,输出会变为:
3 [{'id': 0, 'status': True, 'location': [0, 0]}, {'id': 1, 'status': True, 'location': [0, 1]}, {'id': 2, 'status': False, 'location': [1, 1]}]
每个实例的location都正确对应JSON中的原始数据。
内容的提问来源于stack exchange,提问作者Axo
相关产品推荐
相关产品推荐

