如何打破同类别对象中列表间的关联?
解决Python类实例共享列表属性的问题
你的问题出在类属性和实例属性的区别上:
问题原因
你定义的my_values = []是Model类的类属性,所有Model的实例都会共享这个列表对象。而name之所以表现正常,是因为你通过m.name = str(i)给每个实例创建了同名的实例属性,覆盖了类属性;但my_values你只是调用append方法,操作的始终是类属性的那个列表,所以所有实例的my_values都会同步变化。
解决方案
有两种常用方法可以让每个实例拥有独立的my_values列表:
方法1:在__init__中初始化实例属性(推荐)
把属性定义移到类的构造方法里,每个实例创建时都会初始化自己的属性:
class Model: def __init__(self): self.name = '' self.my_values = [] models = [] for i in range(3): m = Model() m.name = str(i) m.my_values.append(i) models.append(m)
方法2:在实例中重新赋值列表(不推荐,易混淆)
如果保留类属性,在每个实例中给my_values重新赋值一个新列表,替代共享的类属性:
class Model: name = '' my_values = [] models = [] for i in range(3): m = Model() m.name = str(i) m.my_values = [i] # 创建新列表,不再使用类属性的列表 models.append(m)
验证结果
运行修改后的代码后,遍历models查看每个实例的属性:
for m in models: print(f"{m.name}: {m.my_values}")
输出会符合预期:
0: [0] 1: [1] 2: [2]
内容的提问来源于stack exchange,提问作者Vlad
相关产品推荐
相关产品推荐

