为何循环结束后列表中所有StreamRules实例的ch均指向最后元素?
问题排查与解决
首先,你的代码存在两个核心问题,导致所有StreamRules实例的ch属性都指向最后一个元素:
1. 误将类本身存入列表,未创建类的实例
你初始化population的代码是:
population= [stream_rules.StreamRules for n in range(len(buffer))]
这里每个元素都是StreamRules类本身,而非类的实例。也就是说,所有population[i]本质上是同一个类对象——你修改population[i].ch时,其实是在修改类的全局属性,自然所有“实例”(实际都是同一个类)都会显示最后一次修改的值。
修复方式:调用类的构造函数创建实例,给StreamRules加上括号:
population= [stream_rules.StreamRules() for n in range(len(buffer))]
2. StreamRules的ch和split是类变量而非实例变量
如果你的StreamRules类是类似下面的定义:
class StreamRules: ch = [] split = 0
这里的ch和split是类变量,所有实例会共享同一个变量。哪怕你创建了多个实例,修改任何一个实例的ch,都会同步影响所有实例。
修复方式:在类的__init__方法中定义实例变量,确保每个实例拥有独立的属性:
class StreamRules: def __init__(self): self.ch = [] # 每个实例独立维护的列表 self.split = 0 # 每个实例独立的分割值
优化后的完整代码
另外,你的代码可以简化,不需要额外的l列表,直接截取buffer的元素赋值即可:
import random # 替换成实际的模块导入路径 from your_module import stream_rules population = [stream_rules.StreamRules() for _ in range(len(buffer))] for i in range(len(buffer)): current_buffer = buffer[i] length = random.randrange(2, len(current_buffer), 1) split = random.randrange(1, length, 1) population[i].split = split # 直接截取buffer元素的前length个值赋值给ch population[i].ch = current_buffer[:length] for idx, rule in enumerate(population): print(f"实例 {idx} 的ch属性: {rule.ch}")
这样修改后,每个StreamRules实例都会拥有独立的ch和split属性,不会再出现所有实例共享同一个值的问题。
内容的提问来源于stack exchange,提问作者lina
相关产品推荐
相关产品推荐

