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
相关产品推荐
相关产品推荐

