为什么在Python 3中[range(10)]
和list(range(10))
是不同的?
输出如下:
>>> print([range(10)])
[range(0, 10)]
>>> print(list(range(10)))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
为什么在Python 3中[range(10)]
和list(range(10))
是不同的?
输出如下:
>>> print([range(10)])
[range(0, 10)]
>>> print(list(range(10)))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
引用文档所述,"列表可以通过多种方式构建":
[range(10)]
生成包含1个元素的列表,其中包括range对象。一般而言,方括号内用逗号隔开的多个元素构成一个包含这些元素的列表。
list(range(10))
class list([iterable])
该构造函数生成一个列表,其项目与 iterable 的项目相同并按相同顺序排列。 iterable 可以是序列、支持迭代的容器或迭代器对象。如果iterable已经是一个列表,则会制作并返回一个副本,类似于
iterable [:]
。例如,list('abc')
返回['a','b','c']
,list((1,2,3))
返回[1,2,3]
。如果没有给出参数,构造函数将创建一个新的空列表,[]
。
在Python 3中,range表示数字的不可变序列,因此在您的情况下,生成的列表是来自这个范围的数字列表。
[x]
表示“生成一个只包含 x
的列表”。
list(x)
表示“生成一个包含 x
的元素的列表”。
range(10)
返回一个对象,打印时显示为 range(0, 10)
(因为它在打印时显示了起始值),其元素是从 0 到 9 的整数。因此,[range(10)]
生成只有一个元素的列表 [range(0, 10)]
,而 list(range(10))
生成包含 10 个元素的列表 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
。
range()
对象放入其中。另一方面,在您的第二个示例中,您使用list()
内置函数将range()
对象转换为列表。[]
仅创建列表。它不会对传入的内容做任何处理。list()
则会返回一个空列表(如果未传入任何内容),或尝试将传入的内容转换为列表对象。
list()
的文档注意到这一点:range()
函数与 Python 2.x 中的 xrange()
函数类似。在 Python 2.x 中,range()
生成一个列表,而 xrange()
返回一个迭代器 - 一个序列对象。
在 Python 2.x 中
>>> range(1)
[0]
>>> type(range(1))
<type 'list'>
在 Python 3.x 中
>>> range(1)
range(0, 1)
>>> type(range(1))
<class 'range'>
要获取列表,您可以将生成器传递给 list()
函数
>>> print (list(range(10)))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
如需进一步参考,请阅读此处
[]
或list
创建带有元素列表的语义。 - user2357112