1

我在这里试过,但它不能打印这样的长数字

for i in range(1,222222222222222):
    print i

错误:

Traceback (most recent call last):
  File "x.py", line 1, in <module>
    for i in range(1,222222222222222):
MemoryError
4

7 回答 7

10

使用 xrange.

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

此函数与 range() 非常相似,但返回的是“xrange 对象”而不是列表。这是一种不透明的序列类型,它产生与相应列表相同的值,但实际上并没有同时存储它们。

于 2012-11-09T10:14:04.940 回答
4

您可能正在使用 Python2,它range()会生成一个数字列表。包含 222222222222222 元素的列表非常大,对于大多数 RAM 来说太大了。

与此相反,xrange()生成一个 xrange 对象,可以像列表一样访问(索引,迭代),但不会占用太多空间,因为值是按需计算的。

在 Python3 中,range()返回一个范围对象,它与 2.x 中的 xrange 对象完全一样。

于 2012-11-09T10:15:34.697 回答
4

使用 xrange 代替范围。range 生成一个列表,将其存储在内存中并对每个项目执行循环。这在处理相当大的数字时会产生内存错误。

xrange 是生成器而不是列表,项目是动态创建的,因此不会损害内存

我希望这有帮助

于 2012-11-09T10:52:58.647 回答
2

请改用 xrange。range 函数实际上是在内存中构造列表,而 xrange 返回一个生成器(类似于迭代器),并且一次只返回一个数字。

for i in xrange(1,222222222222222L):
    print i

在此处查看有关该主题的更多信息

于 2012-11-09T10:15:06.540 回答
1

Python 在开始循环之前创建范围,导致大量内存使用/oom 错误。

你最好使用 xrange,它以更小的部分分配范围。

for i in xrange(from, to):
    print i
于 2012-11-09T10:14:56.117 回答
0

您也可以自己使用 yield创建生成器:

def my_gen(start, end, step):
    while start < end:
        start += step
        yield start

for x in my_gen(1, 1000, 2):
    print x
于 2012-11-09T10:22:16.423 回答
-1

检查这个 While 循环的例子

a = 0
while a < 10 :
    a += 1
    print (a)

你也可以使用“For Loop”来做同样的事情

onetoten = range(1,11)
for count in onetoten:
    print (count)
于 2012-11-09T10:15:13.433 回答