xrange and range in Python
The flippant answer is that
range exists and
In Python 2,
range returned a
xrange returned an iterable that did not actually generate the full list when called. So
range(2**23458) would run you out of memory, but
xrange(2**23458) would return just fine and be useful.
Python 3 did away with
range and renamed
range, so it’s always safe to call
range with as large a value as you like.
xrange was not an iterator. It, like the Python 3
range (which as
you say is the old
xrange renamed) is a lazy sequence which computes
its values on demand, rather than pre-allocating a list.
The test for an iterator is to call
iter and see if it returns the
>>> r = range(100000) >>> it = iter(r) >>> iter(it) is it # is "it" an iterator? yes True >>> iter(r) is r # is "r" (range object) an iterator? no False
We can compare their types:
>>> print type(r), type(it) <type 'xrange'> <type 'rangeiterator'>
and confirm that range objects provide the full Sequence interface:
>>> import collections >>> isinstance(r, collections.Sequence) True
All of this remains the case in Python 3:
range is not an iterator, it
is a lazy sequence.
I am also looking difference between xrange and range in python
Zachary’s post has a good explanation for the difference:
aside from a minor error in describing xrange as an iterator, but
otherwise his explanation is excellent.
Yes, sorry; I used the wrong syllable in haste. I’ve edited my original post to avoid future confusion.