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
相关产品推荐
相关产品推荐

