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

