范围()真的创build列表?

我的教授和这个人都声称这个range创造了一个价值清单。

“注意:范围函数只是返回一个包含从x到y-1的数字的列表,例如,范围(5,10)返回列表[5,6,7,8,9]。

我相信这是不准确的,因为:

 type(range(5, 10)) <class 'range'> 

此外,访问由range创build的整数的唯一显而易见的方法是遍历它们,这导致我认为将range标记为列表是不正确的。

在Python 2.x中, range返回一个列表,但在Python 3.x range返回一个types为range的不可变序列。

Python 2.x:

 >>> type(range(10)) <type 'list'> >>> type(xrange(10)) <type 'xrange'> 

Python 3.x:

 >>> type(range(10)) <class 'range'> 

在Python 2.x中,如果你想获得一个可迭代对象,就像在Python 3.x中一样,你可以使用xrange函数,它返回一个types为xrange的不可变序列。

Python 2.x中xrange超越range优点:

xrange()超出range()的优点是极小的(因为xrange()在被要求的时候仍然需要创build值),除非在内存不足的机器上使用非常大的范围,或者当所有范围的元素都是从来没有使用过(比如当循环通常以break结束时)。

注意:

此外,访问由range()创build的整数的唯一显而易见的方法是遍历它们,

不。 由于Python 3中的range对象是不可变的序列,因此它们也支持索引。 从range函数文档引用,

范围实现除串联和重复以外的所有常见序列操作

Range对象实现了collections.abc.Sequence ABC,并提供了诸如包含testing, 元素索引查找 ,切片和负指数支持等function。

例如,

 >>> range(10, 20)[5] 15 >>> range(10, 20)[2:5] range(12, 15) >>> list(range(10, 20)[2:5]) [12, 13, 14] >>> list(range(10, 20, 2)) [10, 12, 14, 16, 18] >>> 18 in range(10, 20) True >>> 100 in range(10, 20) False 

所有这些都可以用这个不变的range序列。


最近我遇到了一个问题,我认为这里应该包括一下。 考虑这个Python 3.x代码

 from itertools import islice numbers = range(100) items = list(islice(numbers, 10)) while items: items = list(islice(numbers, 10)) print(items) 

人们会期望这个代码每十个数字打印一个列表,直到99.但是,它会无限地运行。 你能解释一下吗?

因为range返回一个不可变的序列 ,而不是一个迭代器对象。 所以,当一个range对象完成时,它总是从头开始。 把它看作是一个不变列表的替代品。 现在问题来了,你将如何解决? 它很简单,你只需要得到一个迭代器。 只需改变

numbers = range(100)

numbers = iter(range(100))

现在, numbers是一个迭代器对象,它记得它以前迭代了多久。 所以,当islice迭代时,它只是从之前结束的地方开始。

这取决于。

在python-2.x中, range实际上会创build一个列表(这也是一个序列),而xrange创build一个xrange对象,可以用来迭代这些值。

另一方面,在python-3.x中, range创build一个可迭代的(或者更具体的说,一个序列)

范围创build一个列表,如果使用的Python版本是2.x。 在这种情况下,只有在多次引用的情况下才能使用范围,否则使用xrange通过重新使用内存使用来创build一个生成器,有时由于使用了惰性方法而使用时间。

xrange在Python 3.x中不存在,而是范围代表了python 2.x的xrange

请参考问题Python 2.X中range和xrange函数有什么区别?