【问题标题】:Why random.shuffle(list(range(n))) works, but random.shuffle(range(n)) does not?为什么 random.shuffle(list(range(n))) 有效,但 random.shuffle(range(n)) 无效?
【发布时间】:2018-01-10 23:27:26
【问题描述】:

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

为什么会这样?

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

【问题讨论】:

  • 您的问题是关于哪种语言的?
  • 您的问题与所写的不正确。输入random.shuffle(list(range(n))) 确实 工作,因为random.shuffle 在原地工作并且不返回任何内容。将其应用于作为参数动态创建的项目不会产生任何可见的结果。

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


【解决方案1】:

Python 3 的 range 现在返回一个范围对象(作为一个不可变序列)而不是列表(如 Python 2)!

Arange-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)

如果您负担得起这样做所需的内存/时间,您首先创建列表的方法也很好。

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 2023-01-21
    • 2013-09-09
    • 1970-01-01
    相关资源
    最近更新 更多