在Python 3中,使用random
模块random.shuffle(list(range(n)))
时有效,但random.shuffle(range(n))
没有。
为什么会这样?
当我输入type(range(n))
时,它会返回range
。
答案 0 :(得分:1)
Python 3的range
现在返回一个范围对象(使用不可变序列)而不是列表(如Python 2)!
range-object(除了其他差异)不支持项目分配,这是您观察到的错误(可能):
File ".../random.py", line 272, in shuffle
x[i], x[j] = x[j], x[i]
TypeError: 'range' object does not support item assignment
第272行是在python中交换两个变量的pythonic方式,这是大多数shuffle算法(如Fisher-Yates)中的常见操作。
docs也提到了这一点(如果你想改组序列):
要重排不可变序列并返回一个新的混洗列表,请使用sample(x,k = len(x))
所以这将起作用(并且相当于改组的任务):
shuffled_list = random.sample(range(n), k=n)
如果您能够承担这样做所需的内存/时间,那么首先创建列表的方法也很好。