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 に答える
2

代わりに xrange を使用してください。range 関数は実際にメモリ内にリストを構築しますが、xrange はジェネレータ (イテレータに似ています) を返し、一度に 1 つの数値のみを返します。

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ループ」を使用して同じことを行うこともできます

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