为什么random.shuffle(list(range(n)))有效,但是random.shuffle(range(n))无效?

4
在Python 3中,使用random模块的random.shuffle(list(range(n)))可以正常工作,但random.shuffle(range(n))则不行。
为什么会这样呢?
当我输入 type(range(n)) 时,返回的是range类型。

3
你的问题是关于哪种语言的? - Smile4ever
1
你的问题并不是按照原样真实的。输入 random.shuffle(list(range(n)))无效的,因为 random.shuffle 是就地操作,不会返回任何内容。将其应用于动态创建的参数项不会产生任何可见结果。 - pjs
1个回答

4
Python 3的range现在返回一个range对象(作为一个不可变序列),而不是列表(像Python 2一样)! range对象(除其他区别外)不支持项目分配,这可能是您观察到的错误。
File ".../random.py", line 272, in shuffle
    x[i], x[j] = x[j], x[i]
TypeError: 'range' object does not support item assignment

在Python中,第272行是交换两个变量的Pythonic方式,这是大多数洗牌算法(如Fisher-Yates)中的常见操作。

文档也提到了这一点(如果您想要对序列进行洗牌):

要对不可变序列进行洗牌并返回一个新的洗牌列表,请使用sample(x, k=len(x))

因此,以下代码也可以实现相同的洗牌效果:

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

如果您有足够的内存和时间,首先创建一个列表的方法也是可以的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接