ChatGPT解决这个技术问题 Extra ChatGPT

整数的最大值和最小值

如何在 Python 中表示整数的最小值和最大值?在 Java 中,我们有 Integer.MIN_VALUEInteger.MAX_VALUE

请注意,在 Python 3 中,int 类型与 Python 2 中的 long 类型基本相同,因此最大值或最小值 int 的概念完全消失了。即使在 Python 2 上,它也基本上是无关紧要的。
@agf:它可以以各种方式相关。例如,在任何需要保存找到的最小值的算法中(如排序算法)。最小值可以在 sys.maxint 初始化,因此它保证找到的任何第一个值都被视为最小值
@Toaster 除了您可以拥有一个所有值都大于 sys.maxint 的列表,因为它只是 Python 2 上 int 类型的最大值,Python 会默默地将其提升为 long
如果您需要在算法中使用“非常大的值”,例如查找通用集合的最小值或最大值,float('inf')float('-inf') 会很有帮助。
@geoff 是的,但现代代码的一个警告是浮点数不能用作类型提示中的 Literal。因此,您不能说列表可以包含 Union[int, Literal[-inf]],即使这可能正是给定应用程序可能需要的内容:/

N
Neuron

蟒蛇 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 就会从普通整数无缝切换到长整数。所以大多数时候,你不需要知道它。


这个数字可能看起来是任意的,但事实并非如此。 9223372036854775807 正好是 2^63 - 1,所以你有一个 64 位整数。通常,n 位整数的值范围为 -2^(n-1)2^(n-1) - 1
请注意,如果您使用的是 32 位 Python 运行时,sys.maxint 将返回 2^31 - 1,即使 Python 将使用 long 数据类型无缝跳转到 64 位。
正如@Akash Rana 所建议的那样,改用 sys.maxsize。它也存在于 Python 2 中,as sys docs 说。这将使代码与两个 Python 版本更加兼容。
你和我对文档中的那条线有不同的解释。 2to3 中的替换是一种很好的快速和肮脏的启发式方法,在大多数情况下不会破坏任何东西——但这两个值之间的差异很重要。最佳实践是使用您实际打算使用的值。如果您在 Python 2 中确实需要 sys.maxint,那么在 Python 3 中您将不再需要它,它应该被完全删除,而不是改为 sys.maxsize
minsize - 与按位 min 运算符相乘得到 minsize ~sys.maxsize
M
Melle

如果您只需要一个比其他所有数字都大的数字,您可以使用

float('inf')

以类似的方式,一个比所有其他人都小的数字:

float('-inf')

这适用于 python 2 和 3。


只是一个注释(虽然无关紧要,但仍然):float('inf')> float('inf')导致'false'。无限数应该大于另一个无限数 :-D ...头脑快照
@Scre 你还能期待什么? x > x 通常是 False,无穷大也不例外。 (另一方面,float('NaN)...)
这实际上不适用于 int cauze cannot convert infinite float to int...但适用于大多数情况
@Scre“在比较操作中,正无穷大于除自身和 NaN 之外的所有值,负无穷小于除自身和 NaN 之外的所有值。” gnu.org/software/libc/manual/html_node/Infinity-and-NaN.html
这不是 OP 问题的答案
m
martineau

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 -- 支持的最大容器长度。这应该是公认的答案。
我想正确的答案取决于用例:在我的 casa(函数中限制参数的默认值)中,这确实是最好的答案,YMMV。
F
Felix An

对于 Python 3,它是

import sys
maxSize = sys.maxsize
minSize = -sys.maxsize - 1

好吧,python 3 确实 exist ,谢天谢地(!);但是 sys.maxint 在 python 3 中不存在(tl;dr: "sys.maxint 常量已被删除(在 python3 中),因为整数的值不再有限制。但是,sys.maxsize 可以用作大于任何实际列表或字符串索引的整数。" )
为什么要创建隐藏内置函数(例如 min()max())的变量?
查找 2 的补码二进制
min = ~sys.maxsize
这些作为算法中的哨兵值非常有用,这是一种常见的用法。请不要删除这个答案,只要明确它是最实用的答案,即使不是数学上最正确的答案。
J
John Kugelman

在 Python 中,一旦您传递值 sys.maxint,整数将自动从固定大小的 int 表示转换为可变宽度的 long 表示,即 231 - 1 或 263 - 1 取决于您的平台。请注意此处附加的 L

>>> 9223372036854775807
9223372036854775807
>>> 9223372036854775808
9223372036854775808L

Python manual

数字由数字文字或内置函数和运算符创建。未经修饰的整数文字(包括二进制、十六进制和八进制数)会产生纯整数,除非它们表示的值太大而无法表示为纯整数,在这种情况下,它们会产生长整数。带有 'L' 或 'l' 后缀的整数文字产生长整数('L' 是首选,因为 1l 看起来太像十一了!)。

Python 非常努力地假装它的整数是数学整数并且是无界的。例如,它可以轻松计算 googol

>>> 10**100
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L

更令人困惑的是,Python 的 long 与 Java 的 long 不同,它更接近于 BigInteger
在python3中,好像没有L后缀,只是int,而不是long,不管数字多大。
我是否可以建议编辑您的答案以显示 type(...) 而不是依靠最后的 L 含义不明确?
@JohnD 有什么歧义?
G
Georgy

您可以像这样使用“inf”:

import math
bool_true = 0 < math.inf
bool_false = 0 < -math.inf

参考:math — Mathematical functions


请注意,math.inf 等同于 float('inf')
作者质疑如何获取 MAX 和 MIN int 值。这个答案与问题有什么关系,因为结果是真假,而不是最大值和最小值?
S
Shital Shah

如果您想要数组或列表索引的最大值(相当于 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


例如,对于最大 32 位 int 使用:np.iinfo(np.int32).max
A
Amit Dube

我严重依赖这样的命令。

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


否 - maxsize 只是可能的最大容器索引。 Python 将愉快地使用 100 位整数及更多
R
Run_Script

sys.maxsize 不是实际支持的最大整数值。您可以将 maxsize 加倍并自行相乘,它仍然是一个有效且正确的值。

但是,如果您尝试 sys.maxsize ** sys.maxsize,它将使您的计算机挂起很长一段时间。正如许多人指出的那样,字节和位大小似乎并不相关,因为它实际上不存在。我猜python在需要更多内存空间时会很高兴地扩展它的整数。所以一般没有限制。

现在,如果您正在谈论以安全的方式打包或存储整数,以便以后可以完整地检索它们,那么这当然是相关的。我真的不确定是否要打包,但我知道 python 的 pickle 模块可以很好地处理这些事情。字符串表示显然没有实际限制。

所以真的,底线是:你的应用程序限制是多少?数字数据需要什么?使用该限制而不是 python 相当不存在的整数限制。