向列表添加类实例后所有元素均为最后实例值的问题求助
问题分析与解决方案
嘿,我一眼就揪出问题根源啦!你的代码里有两处关键的属性定义错误,才导致列表里所有元素最后都和最后插入的实例值一模一样:
1. 核心问题:类属性与实例属性搞混了
(1)Child类的x是共享的类属性
你定义Child时直接写了x = None,这属于类属性——也就是说所有Child实例都会共用同一个x变量。每次循环里修改self.tempObject.x = i,其实是在修改Child类本身的x值,而非当前创建的实例独有的x。所以最后所有实例的x都会被覆盖成最后一次循环的i(也就是9)。
(2)SomeParent的属性定义不规范
你在SomeParent里定义的listOfObject和tempObject也是类属性,而且代码里listOfObject.append还漏写了self.(会直接触发NameError)。如果这两个属性是每个SomeParent实例单独使用的,必须改成实例属性。
2. 修正后的完整代码
第一步:把Child的x改成实例属性
给Child添加__init__方法,在里面初始化每个实例独有的x:
class Child: def __init__(self): self.x = None # 这是实例属性,每个Child实例都有自己的x副本
第二步:修正SomeParent的属性定义
把类属性改成实例属性,在__init__里初始化,同时补全self.调用:
class SomeParent: def __init__(self): self.listOfObject = [] # 每个实例拥有独立的列表 self.tempObject = None # 每个实例拥有独立的临时对象 def addObjects(self): for i in range(10): self.tempObject = Child() self.changeTempObjectX(i) self.listOfObject.append(self.tempObject) # 补全self.,调用实例的列表 def changeTempObjectX(self, i): self.tempObject.x = i
3. 验证效果
现在运行这段代码,调用addObjects后,listOfObject里的每个Child实例的x会依次对应0到9,不会再全部变成最后一个值了。
测试示例:
parent = SomeParent() parent.addObjects() for obj in parent.listOfObject: print(obj.x) # 会输出0、1、2...9
内容的提问来源于stack exchange,提问作者Edcel Celiz
相关产品推荐
相关产品推荐

