"range(0,2)"和"list(range(0,2))"之间有什么区别?

cyb*_*org 19 python python-2.7 python-3.x

需要了解的区别range(0,2)和list(range(0,2))使用python2.7

两者都返回一个列表,那究竟是什么区别呢?

Ana*_*mar 37

在Python 3.x中,

range(0,3)返回一类不可变的可迭代对象,它们允许你迭代它们,它不会产生列表,并且它们不会将所有元素存储在内存中的范围内,而是它们会动态生成元素(当你迭代它们时) ,而list(range(0,3))产生一个列表(通过遍历所有元素并在内部附加到列表).

示例 -

>>> range(0,3)
range(0, 3)
>>> list(range(0,3))
[0, 1, 2]
Run Code Online (Sandbox Code Playgroud)

理想情况下,如果您只想迭代该范围的值,range(0,3)那么速度会快于(list(range(0,3))后者在开始迭代之前产生列表的开销.

在Python 2.x中,range(0,3)生成一个列表,而我们还有一个xrange()函数,它具有与range()Python 3.x 类似的函数行为(xrange在Python 3.x中被重命名为range)

对于Python 3.5,从文档 -

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

所以你可以做的事情 -

>>> range(0,10)[5]
5
>>> range(0,10)[3:7]
range(3, 7)
>>> 5 in range(6,10)
False
>>> 7 in range(1,8)
True
Run Code Online (Sandbox Code Playgroud)

所有这些都是恒定时间操作,从这个测试中可以看出 -

In [11]: %timeit a = xrange(0,1000000)[1000]
1000000 loops, best of 3: 342 ns per loop

In [12]: %timeit a = xrange(0,1000000)[10000]
1000000 loops, best of 3: 342 ns per loop

In [13]: %timeit a = xrange(0,1000000)[100000]
1000000 loops, best of 3: 342 ns per loop

In [14]: %timeit a = xrange(0,1000000)[999999]
1000000 loops, best of 3: 342 ns per loop

In [15]: %timeit a = xrange(0,10000000)[9999999]
1000000 loops, best of 3: 339 ns per loop

In [16]: %timeit a = xrange(0,1000000000000)[9999999999]
1000000 loops, best of 3: 341 ns per loop
Run Code Online (Sandbox Code Playgroud)


Yu *_*Hao 12

这取决于您使用的Python版本.

在Python 2.x中,range()返回一个列表,因此它们是等效的.

在Python 3.x中,range()返回一个不可变的序列类型,您需要list(range(0,2))获取一个列表.

  • 实际上`range`不会返回一个生成器,它是一个不可变的对象.尝试做`next(range(0,5))`.你会明白的. (5认同)