2017-08-03 55 views
0

当在Python 3中使用random模块random.shuffle(list(range(n)))工作,但random.shuffle(range(n))没有。为什么random.shuffle(list(range(n)))有效,但random.shuffle(range(n))不?

这是为什么?

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

+3

您的问题涉及哪种语言? – Smile4ever

+0

谢谢你,这是python –

+1

你的问题是不正确的,如书面。输入'random.shuffle(list(range(n)))'不会**工作,因为'random.shuffle'就地工作并且不返回任何东西。将它应用到动态创建的参数将不会产生任何可见的结果。 – pjs

回答

0

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交换两个变量的Python的路,这是大多数随机算法中的常见操作(如Fisher-Yates)。

docs也提到了这一点(如果你想整理序列):

要洗牌不可变的序列,并返回一个新的洗牌列表,使用样品(X,K = LEN(X)),而不是

那么这将工作(和相当于给出洗牌的任务):

shuffled_list = random.sample(range(n), k=n) 

你首先创建一个列表的方式也未尝不可,如果你能负担得起的内存/时间。

相关问题