我是Python的新手,我在阅读this页面时看到了一个奇怪的语句:
if n+1 == n: # catch a value like 1e300
raise OverflowError("n too large")
x等于大于它的数字吗?我感到警队受到干扰。
我知道在Python 3中,整数没有固定的字节长度。因此,没有整数溢出,就像C的
int
是如何工作的。但是,内存当然不能存储无限的数据。我认为这就是
n+1
的结果可以与n
相同的原因:Python无法分配更多的内存来执行求和,因此将其跳过,并且n == n
为true。那是对的吗?如果这样,可能会导致程序结果不正确。为什么在无法执行操作时Python不会引发错误,就像C ++的
std::bad_alloc
一样?即使
n
不太大并且检查结果为false,由于相乘,result
也将需要更多字节。 result *= factor
是否可能由于相同的原因而失败?我在官方Python文档中找到了它。检查大整数/可能的整数“溢出”真的是正确的方法吗?
最佳答案
Python3
只有花车有
python中的硬限制。整数是are implemented as “long” integer objects of arbitrary size in python3和do not normally overflow。
您可以使用以下代码测试该行为
import sys
i = sys.maxsize
print(i)
# 9223372036854775807
print(i == i + 1)
# False
i += 1
print(i)
# 9223372036854775808
f = sys.float_info.max
print(f)
# 1.7976931348623157e+308
print(f == f + 1)
# True
f += 1
print(f)
# 1.7976931348623157e+308
您可能还想看看sys.float_info和sys.maxsize
Python2
在python2中,如documentation for numeric types中所述,整数会自动转换为长整数
import sys
i = sys.maxsize
print type(i)
# <type 'int'>
i += 1
print type(i)
# <type 'long'>
result *= factor
是否可能由于相同的原因而失败?为什么不尝试呢?
import sys
i = 2
i *= sys.float_info.max
print i
# inf
如the docs for float中所述,Python对无穷大(以及负无穷大)具有特殊的浮点值。