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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:15:40