range()真的创建列表吗?

时间:2014-04-22 13:27:27

标签: python range

我的教授和this guy都声称range会创建一个值列表。

  

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

我认为这是不准确的,因为:

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

此外,访问range创建的整数的唯一明显方法是迭代它们,这使我相信将range标记为列表不正确。

4 个答案:

答案 0 :(得分:102)

在Python 2.x中,range返回一个列表,但在Python 3.x range中返回一个类型为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函数,它返回一个类型为xrange的不可变序列。

在Python 2.x中xrange超过range的优势:

  

xrange()优于range()的优势很小(因为xrange()仍需要在被要求时创建值),除非在内存饥饿时使用非常大的范围机器或从不使用所有范围的元素时(例如循环通常以中断终止)。

注意:

  

此外,访问range()创建的整数的唯一明显方法是迭代它们,

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

  

Ranges实现除串联和重复之外的所有常见序列操作

     

...

     

Range对象实现了collections.abc.Sequence ABC,并提供了包含测试,元素索引查找,切片和支持负索引等功能。

例如,

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

人们会期望这段代码每隔10个数字打印一次,直到99.但是,它会无限运行。你能说出理由吗?

<强>解决方案

  

因为range返回不可变的序列,而不是迭代器对象。因此,只要在islice对象上完成range,它就始终从头开始。可以将其视为不可变列表的替代品。现在问题来了,你将如何解决它?它很简单,你只需要从它得到一个迭代器。只需改变

        numbers = range(100)

 到

        numbers = iter(range(100))

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

答案 1 :(得分:7)

取决于。

在python-2.x中,range实际上创建了一个列表(也是一个序列),而xrange创建了一个xrange对象,可用于迭代值。

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

答案 2 :(得分:1)

如果使用的python版本是2.x,则

范围会创建一个列表。 在这种情况下,只有在多次引用时才使用范围,否则使用xrange,通过重新使用内存使用量来创建一个生成器,有时候因为它具有惰性方法。

xrange不在python 3.x中而是range代表xrange对于python 2.x

参考问题  What is the difference between range and xrange functions in Python 2.X?

答案 3 :(得分:-1)

var = list(range(start, end+1)