You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:50:10