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

为何TerrainTile实例共享resourceList?append方法异常排查

问题根源:类属性与实例属性的混淆

你遇到的情况,本质是把类属性当成了实例属性来用,导致所有TerrainTile实例共享同一个resourceList列表。

错误的写法(导致共享的原因)

如果你的类是这样定义的:

class TerrainTile:
    # 这里定义的是类属性,属于TerrainTile类本身,所有实例共享
    resourceList = []

    def add_resource_object(self, obj):
        self.resourceList.append(obj)
        return

在Python中,类定义里直接声明的变量是类属性,它属于整个类,而不是某个具体的实例。所有TerrainTile的实例,在访问self.resourceList时,因为实例本身没有这个属性,会自动去类层面找这个共享的列表——所以不管哪个实例调用add_resource_object,都是在操作同一个全局的列表,自然会同步到所有实例。

正确的写法(让每个实例拥有独立列表)

要让每个实例都有自己的resourceList,你需要在类的__init__方法里初始化实例属性:

class TerrainTile:
    def __init__(self):
        # 每个实例初始化时,创建属于自己的空列表
        self.resourceList = []

    def add_resource_object(self, obj):
        self.resourceList.append(obj)
        return

__init__是实例的构造方法,每次创建TerrainTile实例时都会执行这里的代码。用self.resourceList = []定义的是实例属性,每个实例会单独持有一份,互相之间完全独立,追加操作只会影响当前实例的列表。

额外补充:为什么append会同步,赋值却不会?

如果你之前尝试过给self.resourceList直接赋值(比如self.resourceList = [obj]),可能会发现不会同步——这是因为赋值操作会给当前实例创建一个新的实例属性,覆盖掉对类属性的引用;但append是直接修改列表本身,没有创建新属性,所以还是在操作类层面的共享列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:34:15