Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python random.shuffle(范围(10))报告类型错误_Python_Python 3.x - Fatal编程技术网

Python random.shuffle(范围(10))报告类型错误

Python random.shuffle(范围(10))报告类型错误,python,python-3.x,Python,Python 3.x,我想生成一个随机列表 In [20]: num_arr = list(range(10)) In [22]: random.shuffle(num_arr) In [23]: print(num_arr) [8, 0, 7, 3, 9, 4, 1, 2, 6, 5] 然而,我试过了 In [24]: num_arr = range(10) In [25]: random.shuffle(num_arr) TypeError: 'range' object does not support it

我想生成一个随机列表

In [20]: num_arr = list(range(10))
In [22]: random.shuffle(num_arr)
In [23]: print(num_arr)
[8, 0, 7, 3, 9, 4, 1, 2, 6, 5]
然而,我试过了

In [24]: num_arr = range(10)
In [25]: random.shuffle(num_arr)
TypeError: 'range' object does not support item assignment
我打算了解为什么它不起作用的机制?

你能提供一些提示吗

random.shuffle
需要一个要洗牌的数字列表,而
range(10)
不提供该列表。查看
范围(10)
返回的内容:

num_arr = range(10)
num_arr
range(0, 10)

type(num_arr)
<class 'range'>

random.shuffle
需要一个要洗牌的数字列表,而
range(10)
不提供该列表。查看
范围(10)
返回的内容:

num_arr = range(10)
num_arr
range(0, 10)

type(num_arr)
<class 'range'>

random.shuffle
对给定的序列进行洗牌,就地,因此它不能是不可变的
iterable
,例如
范围
。您需要提供一个
列表

修复代码的推荐方法是在
范围
之外创建一个
列表
,将其传递给
列表
类型构造函数,即
列表(范围(10))

另一种(不太常见)方法是使用列表理解:

num_arr = [n for n in range(10)]
random.shuffle(num_arr)

但是,请注意,

random.shuffle
将对给定序列进行洗牌,在适当的位置,因此它不能是不可变的
可替换的
,例如
范围
。您需要提供一个
列表

修复代码的推荐方法是在
范围
之外创建一个
列表
,将其传递给
列表
类型构造函数,即
列表(范围(10))

另一种(不太常见)方法是使用列表理解:

num_arr = [n for n in range(10)]
random.shuffle(num_arr)

但是,请注意,

shuffle函数需要传递一个列表,而range函数的工作方式更像一个生成器。要看到这一点,我们将创建自己的
my_range
函数来复制range函数,并尝试将其传递给shuffle,您将得到类似的错误

import random

def my_range(num: int):
    begin = 0
    while begin < num:
        yield begin
        begin += 1

f = random.shuffle(my_range(10))
随机导入
def my_范围(数值:整数):
开始=0
当开始
shuffle函数需要传递一个列表,range函数的工作原理更像一个生成器。要看到这一点,我们将创建自己的
my_range
函数来复制range函数,并尝试将其传递给shuffle,您将得到类似的错误

import random

def my_range(num: int):
    begin = 0
    while begin < num:
        yield begin
        begin += 1

f = random.shuffle(my_range(10))
随机导入
def my_范围(数值:整数):
开始=0
当开始
看起来,shuffle函数使用类似于
obj[0]
的项目分配来移动项目。如果使用
random.sample()
,您可以执行任何操作。欢迎使用python 3
shuffle(range())
在Python2.7=)中运行良好)您使用的是Python3吗?我在Python2.7上试过这个,没有问题range()返回一个
list
,但我知道Python 3将
range()
更改为与Python 2中的
xrange()
相同,因此可能存在差异。@lenik:
shuffle(range())
如果在调用中实际构造新的
range
,那么它是毫无意义的
random.sample(范围(n),n)
至少是有用的(因为它构造并返回一个全新的
list
)。它看起来像是shuffle函数使用类似
obj[0]
的项目赋值来移动项目。如果使用
random.sample()
,您可以做任何想做的事情。欢迎使用python 3
shuffle(range())
在Python2.7=)中运行良好)您使用的是Python3吗?我在Python2.7上试过这个,没有问题range()返回一个
list
,但我知道Python 3将
range()
更改为与Python 2中的
xrange()
相同,因此可能存在差异。@lenik:
shuffle(range())
如果在调用中实际构造新的
range
,那么它是毫无意义的<代码>随机。示例(范围(n),n)至少有用(因为它构造并返回一个全新的
列表
)。当普通
列表(范围(10))
工作时,请不要建议使用无操作
列表
理解(特别是在一个大的块中,它看起来像是“答案”)。它只是使初学者经常犯的错误永久化,即不必要地使用
list
理解<代码>列表(范围(10))是正确的转换方式。@ShadowRanger Fair comment。我已经更新了我的答案。当普通的
列表(范围(10))
有效时,请不要建议使用no op
列表
理解(特别是在一个大的块中,它看起来像“答案”)。它只是使初学者经常犯的错误永久化,即不必要地使用
list
理解<代码>列表(范围(10))是正确的转换方式。@ShadowRanger Fair comment。我已经更新了我的答案。