Python 3.6自定义类实例化后内部类对象未重置问题咨询
问题根源:类变量 vs 实例变量的混淆
你遇到的这个问题太典型了——本质上是把类变量当成了实例变量来用,导致所有实例共享了同一个变量的引用,第一个实例修改后,后续实例自然会受到影响。
先还原你的简化代码场景:
class TestModel: # 这里定义的是类变量,属于TestModel这个类本身,所有实例共享 lr_space = [0.1, 0.01, 0.001] def run(self): # 这里修改的是类变量,因为self.lr_space会先找实例变量,找不到就去类里找 self.lr_space.pop() print(self.lr_space)
当你第一次实例化并运行时:
model1 = TestModel() model1.run() # 输出 [0.1, 0.01]
这时候lr_space作为类变量已经被修改了,因为self.lr_space指向的是类的那个列表,而不是实例自己的独立副本。
第二次实例化时,model2的lr_space依然指向同一个类变量,所以运行run()时,操作的是已经被修改过的列表:
model2 = TestModel() model2.run() # 输出 [0.1],和你预期的初始列表完全不符
解决方案:把类变量改成实例变量
要让每个实例拥有独立的lr_space,你需要在类的__init__方法里初始化这个变量,这样每个实例创建时都会生成自己的专属副本:
class TestModel: def __init__(self): # 这里定义的是实例变量,每个实例都有自己独立的版本 self.lr_space = [0.1, 0.01, 0.001] def run(self): self.lr_space.pop() print(self.lr_space)
现在再测试两次运行:
model1 = TestModel() model1.run() # 输出 [0.1, 0.01] model2 = TestModel() model2.run() # 输出 [0.1, 0.01],完全符合你预期的独立运行效果
额外判断规则
如果你的场景确实需要所有实例共享同一个lr_space(比如修改后所有实例都要同步看到变化),那类变量的用法是对的,但显然你的需求是每个实例独立运行,所以必须用实例变量。
记住一个简单的区分方法:
- 如果变量是每个实例独有的状态,就放到
__init__里用self.定义; - 如果是所有实例共享的属性/配置,才定义成类变量。
内容的提问来源于stack exchange,提问作者O.rka
相关产品推荐
相关产品推荐

