Python修改__init__接收参数后,可变非静态类变量代码出错排查
分析:修改__init__接收参数后异常的常见原因
嘿,看起来你大概率踩中了Python里一个经典的新手陷阱——可变默认参数的坑!结合你原本的代码逻辑(每个实例拥有独立的arr列表),我来帮你拆解问题:
你可能的错误修改方式
我猜你把__init__改成了类似这样的写法:
class Cla: # 错误:用可变对象([])作为默认参数 def __init__(self, arr=[]): self.arr = arr def showIds(self): print(str(id(self.arr))) def show(self): print(self.arr)
为什么这会出问题?
Python里有个容易被忽略的规则:函数的默认参数只会在函数定义的时候初始化一次,而不是每次调用__init__创建实例时重新生成。这就导致所有没有传入arr参数的实例,都会共享同一个列表对象!
比如运行这段错误代码,你会看到完全不符合预期的结果:
a = Cla() b = Cla() a.showIds() # 两个实例的arr会输出同一个内存地址 b.showIds() a.arr.append(10) b.show() # 居然会输出[10],而不是你想要的空列表!
正确的修改姿势
要保证每个实例都拥有独立的可变对象,我们需要在__init__内部动态创建新的列表,而不是依赖默认参数的可变对象:
class Cla: # 正确做法:默认参数设为None,内部初始化新列表 def __init__(self, arr=None): # 如果没传参数,创建新的空列表 if arr is None: self.arr = [] else: # 可选:如果传入了列表,最好创建副本,避免外部修改影响实例内部 self.arr = arr.copy() def showIds(self): print(str(id(self.arr))) def show(self): print(self.arr)
验证正确结果
现在运行修改后的代码,就能回到你原本预期的行为:
a = Cla() b = Cla() a.showIds() # 输出不同的内存地址,说明是独立的列表 b.showIds() a.arr.append(10) b.arr.append(20) a.show() # [10] b.show() # [20]
内容的提问来源于stack exchange,提问作者Krishna




