我是 Python 新手,我在阅读此页面时看到了一个奇怪的声明:

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是正确的。那是对的吗?

如果是这样,可能会导致程序结果不正确。为什么 Python 在无法执行操作时不会像 C++ 那样抛出错误std::bad_alloc?

即使n不是太大并且检查结果为假,result- 由于乘法 - 也将需要更多的字节。会result *= factor因为同样的原因失败吗?

我在Python官方文档中找到了它。这真的是检查大整数/可能的整数“溢出”的正确方法吗?

问题回答

在Python中只有浮点数有硬限制。整数在 python3 中被实现为任意大小的“长”整数对象,并且通常不会溢出。

您可以使用以下代码测试该行为

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 中,如果整数太大,则会自动转换为长整数,如数字类型文档中所述

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
Python 有一个特殊的无穷大浮点值(也有负无穷大),如浮点文档中所述