当范围反转时为什么是range_iterator?

时间:2016-03-07 00:06:43

标签: python-3.x range

我可以下标range个对象:

>>> r = range(4)
>>> r 
range(0, 4)
>>> r[3]
3
>>> for i in r:
    print(i)

0
1
2
3
>>> list(r)
[0, 1, 2, 3]

但是,如果我在同一个reversed对象上调用range

>>> r = reversed(range(4))
>>> r
<range_iterator object at memaddr>
>>> for i in r:
    print(i)
3
2
1
0
>>> r[3]
TypeError: 'range_iterator' object is not subscriptable         # ?
>>> range(r)
TypeError: 'range_iterator' cannot be interpreted as an integer # ?
>>> list(r)
[]          # ? uhmm

嗯......表演有点像发电机但不太有用。

是否有理由反转范围对象不像普通的生成器/迭代器那样嘎嘎叫?

2 个答案:

答案 0 :(得分:6)

reversed函数返回迭代器,而不是序列。这就是它的设计方式。您看到的range_iterator基本上iter会调用您想要的反向range

要获得反向序列而不是反向迭代器,请使用&#34;外星人笑脸&#34;切片:r[::-1](其中r是您从range获得的值)。这适用于Python 2(其中range返回列表)和Python 3(其中range返回类似序列的range对象)。

答案 1 :(得分:1)

您需要将r更改回list类型。例如:

reversed([1,2]) #prints <listreverseiterator object at 0x10a0039d0>
list(reversed([1,2])) #prints [2,1]

修改

为了澄清您的要求,这里有一些示例I / O:

>>> r = range(5)
>>> x = reversed(r)
>>> print x
<listreverseiterator object at 0x10b6cea90>
>>> x[2]

Traceback (most recent call last):
  File "<pyshell#24>", line 1, in <module>
    x[2]
TypeError: 'listreverseiterator' object has no attribute '__getitem__'
>>> x = list(x)
>>> x[2] #it works here
2