3

同様の状況で両方の例外が発生しているようです。

これら 2 つのコード行のそれぞれの違いと、舞台裏で何が起こっているのでしょうか?

>>> (i for i in range(1000000000)) # 10^9
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError
>>> (i for i in range(10000000000)) # 10^10
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: range() result has too many items
4

2 に答える 2

4

最初の例では、1,000,000,000 個の整数のリストをジェネレータ式に渡そうとしています。そのリストを作成しようとして、コンピュータのメモリが不足しています。rangePython 3 では、それ自体が明示的なリストの代わりにジェネレーターを生成するため、これが機能すると思われます。

2 番目の例ではrange、マシンの入力に 32 ビット値が必要であると思われるため、メモリが不足する前に別のエラーがスローされます。

于 2013-07-24T13:29:55.223 に答える
2

ドキュメントから:

例外のオーバーフロー エラー

算術演算の結果が大きすぎて表現できない場合に発生します。これは、長い整数 (断念するよりもむしろ MemoryError を発生させる) や、代わりに長い整数を返す単純な整数を使用するほとんどの操作では発生しません。C では浮動小数点の例外処理が標準化されていないため、ほとんどの浮動小数点演算もチェックされません。

例外 MemoryError

操作でメモリが不足した場合に発生しますが、(一部のオブジェクトを削除することで) 状況を解決できる可能性があります。関連する値は、どのような (内部) 操作がメモリ不足になったかを示す文字列です。基礎となるメモリ管理アーキテクチャ (C の malloc() 関数) のため、インタプリタは常にこの状況から完全に回復できるとは限らないことに注意してください。それにもかかわらず、ランナウェイ プログラムが原因である場合に備えて、スタック トレースバックを出力できるように、例外が発生します。

Python 2 では、要素を含むrange(1000000000)リストが生成1000000000され、メモリ不足が発生します。に置き換えるrangexrange、代わりにジェネレーターを使用しているため、問題はなくなります。

2 番目の例で1000000000は、実際には long です。を使用するxrangeと、次のようになります。

>>> (i for i in xrange(10000000000))
OverflowError: long int too large to convert to int
于 2013-07-24T13:23:15.617 に答える