如何在 Python 中表示整数的最小值和最大值?在 Java 中,我们有 Integer.MIN_VALUE
和 Integer.MAX_VALUE
。
int
类型与 Python 2 中的 long
类型基本相同,因此最大值或最小值 int
的概念完全消失了。即使在 Python 2 上,它也基本上是无关紧要的。
sys.maxint
的列表,因为它只是 Python 2 上 int
类型的最大值,Python 会默默地将其提升为 long
。
float('inf')
或 float('-inf')
会很有帮助。
Literal
。因此,您不能说列表可以包含 Union[int, Literal[-inf]]
,即使这可能正是给定应用程序可能需要的内容:/
蟒蛇 3
在 Python 3 中,这个问题不适用。普通的 int
类型是未绑定的。
但是,您实际上可能正在寻找有关当前解释器 word size 的信息,这在大多数情况下与机器的字长相同。该信息在 Python 3 中仍以 sys.maxsize
的形式提供,它是有符号字可表示的最大值。等效地,它是最大可能列表或内存中 sequence 的大小。
一般无符号字可表示的最大值为sys.maxsize * 2 + 1
,字的位数为math.log2(sys.maxsize * 2 + 2)
。有关详细信息,请参阅 this answer。
蟒蛇2
在 Python 2 中,普通 int
值的最大值可用作 sys.maxint
:
>>> sys.maxint
9223372036854775807
您可以使用 -sys.maxint - 1
计算最小值,如 here 所示。
一旦超过这个值,Python 就会从普通整数无缝切换到长整数。所以大多数时候,你不需要知道它。
如果您只需要一个比其他所有数字都大的数字,您可以使用
float('inf')
以类似的方式,一个比所有其他人都小的数字:
float('-inf')
这适用于 python 2 和 3。
x > x
通常是 False
,无穷大也不例外。 (另一方面,float('NaN)
...)
int
cauze cannot convert infinite float to int
...但适用于大多数情况
sys.maxint
常量已从 Python 3.0 开始移除,改为使用 sys.maxsize
。
整数 PEP 237:本质上,早就重命名为 int。也就是说,只有一种内置的整数类型,名为 int;但它的行为主要类似于旧的 long 类型。 PEP 238:像 1/2 这样的表达式返回一个浮点数。使用 1//2 获得截断行为。 (后一种语法已经存在多年,至少从 Python 2.2 开始。) sys.maxint 常量已被删除,因为整数的值不再有限制。但是,sys.maxsize 可以用作大于任何实际列表或字符串索引的整数。它符合实现的“自然”整数大小,并且通常与同一平台上先前版本中的 sys.maxint 相同(假设相同的构建选项)。长整数的 repr() 不再包括尾随的 L,因此无条件剥离该字符的代码将改为截断最后一个数字。 (使用 str() 代替。)八进制文字不再是 0720 形式;改用 0o720。
参考:https://docs.python.org/3/whatsnew/3.0.html#integers
help(sys)
:maxsize -- 支持的最大容器长度。这应该是公认的答案。
对于 Python 3,它是
import sys
maxSize = sys.maxsize
minSize = -sys.maxsize - 1
sys.maxint
在 python 3 中不存在(tl;dr: "sys.maxint
常量已被删除(在 python3 中),因为整数的值不再有限制。但是,sys.maxsize
可以用作大于任何实际列表或字符串索引的整数。" )
min()
和 max()
)的变量?
min = ~sys.maxsize
在 Python 中,一旦您传递值 sys.maxint
,整数将自动从固定大小的 int
表示转换为可变宽度的 long
表示,即 231 - 1 或 263 - 1 取决于您的平台。请注意此处附加的 L
:
>>> 9223372036854775807
9223372036854775807
>>> 9223372036854775808
9223372036854775808L
数字由数字文字或内置函数和运算符创建。未经修饰的整数文字(包括二进制、十六进制和八进制数)会产生纯整数,除非它们表示的值太大而无法表示为纯整数,在这种情况下,它们会产生长整数。带有 'L' 或 'l' 后缀的整数文字产生长整数('L' 是首选,因为 1l 看起来太像十一了!)。
Python 非常努力地假装它的整数是数学整数并且是无界的。例如,它可以轻松计算 googol:
>>> 10**100
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L
long
与 Java 的 long
不同,它更接近于 BigInteger
。
L
后缀,只是int
,而不是long
,不管数字多大。
type(...)
而不是依靠最后的 L
含义不明确?
您可以像这样使用“inf”:
import math
bool_true = 0 < math.inf
bool_false = 0 < -math.inf
参考:math — Mathematical functions
math.inf
等同于 float('inf')
如果您想要数组或列表索引的最大值(相当于 C/C++ 中的 size_t
),您可以使用 numpy:
np.iinfo(np.intp).max
这与 sys.maxsize
相同,但优点是您不需要 import sys 仅仅为此。
如果您希望机器上的本机 int 为 max:
np.iinfo(np.intc).max
您可以在 doc 中查看其他可用类型。
对于浮点数,您也可以使用 sys.float_info.max
。
np.iinfo(np.int32).max
我严重依赖这样的命令。
python -c 'import sys; print(sys.maxsize)'
返回的最大整数:9223372036854775807
有关“sys”的更多参考,您应该访问
https://docs.python.org/3/library/sys.html
https://docs.python.org/3/library/sys.html#sys.maxsize
sys.maxsize
不是实际支持的最大整数值。您可以将 maxsize 加倍并自行相乘,它仍然是一个有效且正确的值。
但是,如果您尝试 sys.maxsize ** sys.maxsize
,它将使您的计算机挂起很长一段时间。正如许多人指出的那样,字节和位大小似乎并不相关,因为它实际上不存在。我猜python在需要更多内存空间时会很高兴地扩展它的整数。所以一般没有限制。
现在,如果您正在谈论以安全的方式打包或存储整数,以便以后可以完整地检索它们,那么这当然是相关的。我真的不确定是否要打包,但我知道 python 的 pickle
模块可以很好地处理这些事情。字符串表示显然没有实际限制。
所以真的,底线是:你的应用程序限制是多少?数字数据需要什么?使用该限制而不是 python 相当不存在的整数限制。
2^63 - 1
,所以你有一个 64 位整数。通常,n 位整数的值范围为-2^(n-1)
到2^(n-1) - 1
。2^31 - 1
,即使 Python 将使用long
数据类型无缝跳转到 64 位。sys.maxsize
。它也存在于 Python 2 中,assys
docs 说。这将使代码与两个 Python 版本更加兼容。2to3
中的替换是一种很好的快速和肮脏的启发式方法,在大多数情况下不会破坏任何东西——但这两个值之间的差异很重要。最佳实践是使用您实际打算使用的值。如果您在 Python 2 中确实需要sys.maxint
,那么在 Python 3 中您将不再需要它,它应该被完全删除,而不是改为sys.maxsize
。