为什么random.shuffle(list(range(n)))有效,但random.shuffle(range(n))不起作用?

时间:2017-08-03 11:25:44

标签: python python-3.x list random iterator

在Python 3中,使用random模块random.shuffle(list(range(n)))时有效,但random.shuffle(range(n))没有。

为什么会这样?

当我输入type(range(n))时,它会返回range

1 个答案:

答案 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)

如果您能够承担这样做所需的内存/时间,那么首先创建列表的方法也很好。