Python类数组行为疑惑:为何多实例共用同一数组?
问题原因与解决方法
核心问题:类属性 vs 实例属性
你定义的arr = []是类属性,它属于整个example类本身,而非类的单个实例。所有example的实例都会共享这个类属性——哪怕你用self.arr访问,只要当前实例没有自己定义同名的实例属性,Python就会自动去类的属性里找,所以本质上所有实例操作的都是同一个数组。
代码执行过程拆解
- 第一次实例化
example()时,__init__里的self.arr.append(69)会找到类的arr,添加第一个69,此时类的arr为[69]。 - 第二次实例化时,同样操作,类的
arr变成[69, 69]。 - 重复到第五次实例化后,类的
arr已经累积了5个69。 - 遍历5个实例时,每个实例的
arr都指向这个有5个元素的共享数组,所以每个实例输出5个69,最终总共输出5×5=25个。
修正方法:改为实例属性
要让每个实例拥有独立的数组,需要在__init__方法里定义实例属性self.arr,这样每个实例初始化时都会创建属于自己的数组:
class example: def __init__(self): self.arr = [] # 这里定义实例专属的数组 self.arr.append(69) examples = [] for i in range(5): examples.append(example()) for e in examples: for a in e.arr: print(str(a))
此时每个实例的arr只有1个69,遍历后会输出5个69,符合你的预期。
内容的提问来源于stack exchange,提问作者meclondrej
相关产品推荐
相关产品推荐

