[Tutor] Workaround for limitation in xrange()?
Danny Yoo
dyoo at hkn.eecs.berkeley.edu
Tue Oct 10 17:46:25 CEST 2006
> >>> for x in xrange(2**31):
> pass
>
> Traceback (most recent call last):
> File "<pyshell#16>", line 1, in <module>
> for x in xrange(2**31):
> OverflowError: long int too large to convert to int
Hi Dick,
Hmmm... I'd consider this a misfeature in the implementation. Apparently
xrange (and range) must be built with regular ints, not long ints. This
limitation is documented, although I think this is inconsistent and a bad
thing.
http://www.python.org/doc/2.3.5/lib/built-in-funcs.html#l2h-73
http://www.python.org/doc/2.3.5/lib/built-in-funcs.html#l2h-55
In the meantime, you can build your own version of xrange that should work
on long ints. Here is an example:
#################
def myxrange(m, n=None, skip=1):
"""An xrange-like function that can deal with long ints.
Note: doesn't deal with negative ranges particularly well."""
if n is None:
m, n = 0, m
i = m
while i < n:
yield i
i = i + skip
#################
This is a "generator" that does pretty much what you'll want.
##################################################################
>>> list(myxrange(1, 5))
[1, 2, 3, 4]
>>> list(myxrange(2**32, 2**32 + 5))
[4294967296L, 4294967297L, 4294967298L, 4294967299L, 4294967300L]
##################################################################
Note: this is a quick-and-dirty function; I wouldn't use it in production
yet. It needs some more work to reject bad input. If you want, we can
talk about exhaustively testing the function using robust equivalence
class testing. *grin*
Best of wishes!
More information about the Tutor
mailing list