Python中__init__方法行为随代码顺序变化的异常问题
类实例共享列表导致的异常原因及修复方案
你遇到的问题核心是:unit类里的units、powers、correspondance被定义成了类级属性,而非每个实例独有的属性。
原因分析
类属性的特性是所有该类的实例共享同一份数据。当你创建第一个实例p时,代码会往这个共享的units列表里添加"T";创建第二个实例q时,又会往同一个列表里追加"T"——所以所有实例的units指向的都是同一个内存地址的列表,修改操作会被所有实例共享。
你的错误代码结构大概是这样:
class unit: # 类属性:所有实例共享同一列表 units = [] powers = [] correspondance = [] def __init__(self, input_str): # 直接操作共享的类属性 self.units.append(input_str)
修复方案
把这些属性移到__init__方法中,定义为实例属性,让每个实例初始化时创建属于自己的独立列表:
class unit: def __init__(self, input_str): # 每个实例拥有独立的列表 self.units = [] self.powers = [] self.correspondance = [] self.units.append(input_str)
此时再执行测试代码:
p = unit("T") print(p.units) q = unit("T") print(q.units)
输出会变为:
['T'] ['T']
无论调整打印顺序,每个实例的units都是独立的,不会互相干扰。
内容的提问来源于stack exchange,提问作者MyDoom
相关产品推荐
相关产品推荐

