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

Python:类初始化器中shuffle生成相同序列问题排查

问题原因与解决方案

核心错误

  1. 可变对象的引用传递:列表是Python中的可变对象,你在初始化时直接将传入的list赋值给self.shuffled_list,导致所有SomeClass实例的shuffled_list都指向同一个原列表对象。
  2. 原地打乱的副作用: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 12:27:02