在python中,MemoryError和OverflowerError之间有什么区别?

在python中,MemoryError和OverflowerError之间有什么区别?,python,memory,out-of-memory,Python,Memory,Out Of Memory,似乎这两个例外都是在类似的情况下提出的 这两个代码行的区别是什么,以及在幕后发生了什么 >>> (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 Trace

似乎这两个例外都是在类似的情况下提出的

这两个代码行的区别是什么,以及在幕后发生了什么

>>> (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
>>(范围(1000000000)内的i代表i)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
记忆者
>>>(i代表范围内的i(1000000000))#10^10
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
OverflowerError:range()结果的项太多

异常溢出错误

当算术运算的结果太大而无法表示时引发。对于长整数(宁愿引发MemoryError也不愿放弃)和大多数使用纯整数的操作(返回长整数)都不会出现这种情况。由于C语言中浮点异常处理缺乏标准化,大多数浮点操作也没有被检查

异常存储器错误

当操作内存不足但仍可以挽救(通过删除某些对象)时引发。关联的值是一个字符串,指示哪种(内部)操作耗尽了内存。注意,由于底层内存管理架构(C的malloc()函数),解释器可能并不总是能够从这种情况中完全恢复;尽管如此,它还是引发了一个异常,以便可以打印堆栈回溯,以防程序失控

在Python2中,
range(100000000)
生成一个包含
100000000
元素的列表,这会导致内存不足。如果将
range
替换为
xrange
,则问题会消失,因为您使用的是发电机

在第二个示例中,
1000000000
实际上是一个长字符。如果使用
xrange
,您将获得:

>>> (i for i in xrange(10000000000))
OverflowError: long int too large to convert to int

在第一个示例中,尝试将100000000个整数的列表传递给生成器表达式。您的计算机试图创建该列表时内存不足。在Python3中,我怀疑这会起作用,因为
range
本身会生成一个生成器,而不是显式列表


在第二个示例中,我怀疑
range
需要一个32位的值作为机器上的输入,因此在内存耗尽之前抛出一个不同的错误。

但是第一个示例生成MemoryError,反之亦然。你是对的-我使用32位python。1000000000 < 2^32 < 10000000000