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

Python类__init__调用共享变量报错问题及内存优化需求

解决类共享变量在__init__中无法访问的问题

你遇到的报错很典型——在__init__里直接写variable1时,Python会在局部和全局作用域找这个名称,但它其实是类的属性,不属于这两个作用域,所以得明确指定访问路径才行。

核心解决方案:正确访问类共享变量

定义在__init__外的变量是类属性,属于整个类的所有实例共享。在实例方法(比如__init__)里,你有两种可靠的访问方式:

方式1:通过类名直接访问

这种方式最明确,直接指向当前类的属性,不会被子类的重写逻辑干扰:

from random import choice
class Chromosome(object):
    variable1 = [x for x in range(1,51)]
    variable2 = [x for x in range(51,101)]
    def __init__(self):
        self.var1 = choice(Chromosome.variable1)
        self.var2 = choice(Chromosome.variable2)

方式2:通过self访问

实例会自动继承类的属性,所以用self.variable1也能拿到共享变量,不过如果子类重写了这个类属性,self会指向子类的版本:

from random import choice
class Chromosome(object):
    variable1 = [x for x in range(1,51)]
    variable2 = [x for x in range(51,101)]
    def __init__(self):
        self.var1 = choice(self.variable1)
        self.var2 = choice(self.variable2)

两种写法都能解决报错,而且完全保留了你“类变量只创建一次、节省内存”的需求——10000个实例会共享同一个variable1和variable2列表,不会重复创建。

更极致的内存优化:直接生成随机数

你提到最终用random.randrange(a,b+1,2)解决了问题,这个方案其实更适配你的场景:不需要预先创建整个列表,直接生成指定区间的偶数,内存开销几乎为0,实例数量越大,这个优化的效果越明显。示例代码如下:

from random import randrange
class Chromosome(object):
    def __init__(self):
        # 在[1,50]区间内随机选取偶数(包含边界)
        self.var1 = randrange(2, 51, 2)
        # 在[51,100]区间内随机选取偶数(包含边界)
        self.var2 = randrange(52, 101, 2)

这个写法既满足了“随机分配参数”的需求,又彻底避免了列表的内存占用,完美契合你的场景。

内容的提问来源于stack exchange,提问作者armara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:46:28