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

Python实例化Agent类时__init__内循环修改属性导致旧对象被覆盖问题

问题原因

你遇到的问题和__init__函数内的for循环无关,属于Python可变对象引用共享的典型问题,根源出在sa.Anm类的实现逻辑上:
所有通过sa.Anm(model_info)创建的实例,它们的elemsSections属性实际上引用的是同一个数组对象,而非每个实例独立拥有的副本。当你在任意一个Agent实例中修改self.model.elemsSections的元素时,本质上是在修改所有实例共享的底层数组,所以所有之前创建的Agent实例的对应属性都会同步更新。

解决方案

你可以通过两种方式修复该问题:

方案1:修改sa.Anm类的初始化逻辑(优先推荐)

在sa.Anm类的__init__方法中,对elemsSections属性做独立拷贝,保证每个实例的属性互不干扰。如果是numpy数组可以直接调用copy()方法:

# sa.Anm类的__init__方法内部示例
import numpy as np
# 原逻辑生成elemsSections模板后,添加拷贝逻辑
self.elemsSections = 原始模板elemsSections.copy()

如果是普通Python列表,可以用深拷贝:

import copy
self.elemsSections = copy.deepcopy(原始模板elemsSections)

方案2:在Agent类中添加拷贝逻辑(无需修改依赖源码)

如果不方便调整sa.Anm的源码,可以直接在你的Agent初始化逻辑中,修改elemsSections前先做拷贝:

class Agent():
    def __init__(self, r = None):
        self.model = sa.Anm(model_info)
        # 新增拷贝逻辑,保证当前实例的elemsSections是独立副本
        self.model.elemsSections = self.model.elemsSections.copy()
        if r is None:
            for n in range(len(self.model.elems)):
                self.model.elemsSections[n] = np.random.choice(self.model.sections[:,0])
        self.fitness = 0
        self.model.drawModel()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:39:01