11

I can subscript a range object:

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

But, if I call reversed on the same range object:

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

Hmm... Acting kinda like a generator but less useful.

Is there a reason a reversed range object isn't like a normal generator / iterator in how it quacks?

1
  • 2
    generator / iterator, you can only loop once and its gone.
    – YOU
    Commented Mar 7, 2016 at 0:37

2 Answers 2

12

The reversed function returns an iterator, not a sequence. That's just how it's designed. The range_iterator you're seeing is essentially iter called on the reversed range you seem to want.

To get the reversed sequence rather than a reverse iterator, use the "alien smiley" slice: r[::-1] (where r is the value you got from range). This works both in Python 2 (where range returns a list) and in Python 3 (where range returns a sequence-like range object).

9

You need to change r back to a list type. For example:

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

Edit

To clarify what you are asking, here is some sample 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
1
  • TypeError: 'list_reverseiterator' object is not subscriptable. This doesn't really answer the question, because this requires reversed(list(range(4))).
    – cat
    Commented Mar 7, 2016 at 0:21

Not the answer you're looking for? Browse other questions tagged or ask your own question.