python: 我可以扩展range()方法的上限吗?

3 投票
5 回答
3245 浏览
提问于 2025-04-15 11:28

range()函数的上限是什么?我该如何扩展它,或者说有什么更好的方法来做到这一点:

for i in range(1,600851475143):

5 个回答

2

pts的回答让我看到了xrange在Python文档中的说明:

注意

xrange()的设计目标是简单和快速。为了实现这个目标,可能会对使用方式有一些限制。Python的C语言实现对所有参数都有要求,必须是C语言的长整型(也就是“短”Python整数),而且还要求元素的数量要能放进一个C语言的长整型里。如果需要更大的范围,可以使用itertools模块中的另一种方法来实现:islice(count(start, step), (stop-start+step-1)//step)

看起来这是C语言实现的Python特有的限制。

2

你有没有想过直接这样做呢?或者说你有特别的理由需要用到 range() 吗?

x = 1
while x < 600851475143:
    // some code
    x += 1
10

range(1, 600851475143) 这个代码想要在内存中生成一个非常大的列表,但这样会导致内存不足的错误。为了节省内存,可以用 xrange 来代替 range。不过,xrange 对于大数字不太适用(这是实现上的限制)。例如(会引发 OverflowError):

for i in xrange(1, 600851475143):
  print i

如果你使用 range,可以在区间内设置很大的最小值或最大值,只要它们之间的差距不大。举个例子:

x = 1 << 200
print list(xrange(x, x + 3))

输出结果:

[1606938044258990275541962092341162602522202993782792835301376L, 1606938044258990275541962092341162602522202993782792835301377L, 1606938044258990275541962092341162602522202993782792835301378L]

这是一个比较高级的解决方案,能解决你最初的 for 循环问题:

def bigrange(a, b = None):
  if b is None:
    b = a
    a = 0
  while a < b:
    yield a
    a += 1

for i in bigrange(1, 600851475143):
  print i

这是一个不那么复杂的解决方案,即使在循环体内有 continue 也能正常工作:

i = 1 - 1
while i < 600851475143 - 1:
  i += 1
  print i

撰写回答