小编典典

range()是否真的创建列表?

python

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

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

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

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

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


阅读 382

收藏
2020-12-20

共1个答案

小编典典

在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中),则可以使用xrangefunction,该函数返回type的不可变序列xrange

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

xrange()over的优点range()是最小的(因为xrange()在要求输入值时仍必须创建值),除非在内存不足的机器上使用了很大的范围或从未使用过所有范围的元素(例如当循环被使用时)。通常以中断终止)。

注意:

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

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

范围实现除连接和重复之外的所有通用序列操作

范围对象实现collections.abc.SequenceABC,并提供诸如包含测试,
元素索引查找 ,切片和对负索引的支持等功能。

例如,

>>> 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。但是,它将无限运行。你能解释为什么吗?

Because the range returns an immutable sequence , not an iterator
object. So, whenever islice is done on a range object, it always starts
from the beginning. Think of it as a drop-in replacement for an immutable
list. Now the question comes, how will you fix it? Its simple, you just have
to get an iterator out of it. Simply change

numbers = range(100)

to

numbers = iter(range(100))

Now, numbers is an iterator object and it remembers how long it has been
iterated before. So, when the islice iterates it, it just starts from the
place where it previously ended.

2020-12-20