Python:类初始化器中shuffle生成相同序列问题排查
问题原因与解决方案
核心错误
- 可变对象的引用传递:列表是Python中的可变对象,你在初始化时直接将传入的
list赋值给self.shuffled_list,导致所有SomeClass实例的shuffled_list都指向同一个原列表对象。 - 原地打乱的副作用:
random.shuffle()是原地修改列表的方法,第一次创建实例A时已经打乱了原列表,创建实例B时,你又对这个已经被打乱过的原列表再次执行打乱操作,最终A和B的shuffled_list指向的是同一个被两次打乱后的列表,所以打印结果完全一致。
修复后的代码
import random class SomeClass: def __init__(self, input_list): # 避免用list作为变量名,和内置类型重名 # 创建传入列表的副本,避免共享同一个对象 self.shuffled_list = input_list.copy() random.shuffle(self.shuffled_list) original_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] A = SomeClass(original_list) B = SomeClass(original_list) print(A.shuffled_list) print('\n\n') print(B.shuffled_list)
额外说明
- 不要用
list作为变量名,这会覆盖Python内置的list类型,可能引发其他问题,改成input_list和original_list更规范。 - 如果传入的是嵌套列表,
copy()只能做浅拷贝,这时需要用copy.deepcopy()来创建完全独立的副本。
内容的提问来源于stack exchange,提问作者3nondatur
相关产品推荐
相关产品推荐

