Python 如何管理 int 和 long?

有人知道 Python 如何在内部管理 int 和 long 类型吗?

  • 它是否动态地选择正确的类型?
  • 整型数的极限是多少?
  • 我使用的是 Python 2.6,与以前的版本有什么不同吗?

我应该如何理解下面的代码?

>>> print type(65535)
<type 'int'>
>>> print type(65536*65536)
<type 'long'>

更新:

>>> print type(0x7fffffff)
<type 'int'>
>>> print type(0x80000000)
<type 'long'>
333357 次浏览

intlong是“统一的”几个版本。在此之前,通过数学运算可以溢出整型数。

3.x 进一步改进了这一点,它完全消除了 long,只使用 int。

  • Python 2 : sys.maxint包含 Python int 可以保持的最大值。
    • 在64位 Python 2.7上,大小为24字节。
  • Python 3 : sys.maxsize包含 Python int 可以包含的最大字节数。
    • 这将是32位的千兆字节,64位的艾字节。
    • 如此大的 int 值将类似于8的 sys.maxsize的幂。

这个 PEP应该有帮助。

底线是,在 Python 版本 > 2.4的情况下,您真的不必担心这个问题

在我的机器上:

>>> print type(1<<30)
<type 'int'>
>>> print type(1<<31)
<type 'long'>
>>> print type(0x7FFFFFFF)
<type 'int'>
>>> print type(0x7FFFFFFF+1)
<type 'long'>

Python 使用 int (32位有符号整数,我不知道它们是不是隐藏的 C int)来表示适合32位的值,但是对于任何更大的值,它会自动切换到 long (任意大量的位——比如 bignum)。我猜这样可以加快处理小值的速度,同时避免向 bignums 无缝过渡时出现溢出。

它管理它们是因为 intlong是兄弟类定义。它们对 + 、-、 * 、/等有适当的方法,这些方法将生成适当类的结果。

比如说

>>> a=1<<30
>>> type(a)
<type 'int'>
>>> b=a*2
>>> type(b)
<type 'long'>

在这种情况下,类 int有一个 __mul__方法(实现 * 的方法) ,该方法在需要时创建一个 long结果。

有意思。在我的64位(i7 Ubuntu)机顶盒上:

>>> print type(0x7FFFFFFF)
<type 'int'>
>>> print type(0x7FFFFFFF+1)
<type 'int'>

估计它在更大的机器上升级到64位整数。

从 python 3.x 开始,统一的整数库甚至比旧版本更加智能。在我的(i7 Ubuntu)机器上我得到了以下信息,

>>> type(math.factorial(30))
<class 'int'>

有关实现的详细信息,请参阅 Include/longintrepr.h, Objects/longobject.c and Modules/mathmodule.c文件。最后一个文件是一个动态模块(编译为 so 文件)。下面的代码注释得很好。

Python 2.7.9 auto 提升了数字。 对于不确定使用 int ()或 long ()的情况。

>>> a = int("123")
>>> type(a)
<type 'int'>
>>> a = int("111111111111111111111111111111111111111111111111111")
>>> type(a)
<type 'long'>

Python2将根据值的大小自动设置类型。最大值的指南可以在下面找到。

Python2中默认 Int 的最大值是65535,超过这个值将是一个长值

例如:

>> print type(65535)
<type 'int'>
>>> print type(65536*65536)
<type 'long'>

在 Python3中,长数据类型已被删除,所有整数值都由 Int 类处理。Int 的默认大小将取决于您的 CPU 体系结构。

例如:

  • 32位系统整数的默认数据类型是“ Int32”
  • 64位系统整数的默认数据类型是“ Int64”

每种类型的最小/最大值如下:

  • Int8: [ -128,127]
  • Int16: [-32768,32767]
  • Int32: [-2147483648,2147483647]
  • Int64: [ -9223372036854775808,9223372036854775807]
  • Int128: [ -170141183460469231731687303715884105728,170141183460469231731687303715884105727]
  • UInt8: [0,255]
  • UInt16: [0,65535]
  • UInt32: [0,4294967295]
  • UInt64: [0,18446744073709551615]
  • UInt128: [0,340282366920938463463374607431768211455]

如果 Int 的大小超过了上面提到的限制,python 将自动改变它的类型并分配更多的内存来处理最小/最大值的增加。在 Python2中,它会转换为‘ long’,现在它只是转换为下一个 Int 大小。

示例: 如果使用的是32位操作系统,则默认情况下 Int 的最大值为2147483647。如果分配的值为2147483648或更多,则类型将更改为 Int64。

有不同的方法来检查 int 的大小和它的内存分配。 注意: 在 Python3中,使用内置 type ()方法将始终返回 <class 'int'>,无论您使用的是什么大小的 Int。

继续回答这里给出的所有问题,特别是“詹姆斯 · 莱恩斯”

整数类型的大小可以用这个公式表示:

总范围 = (2 ^ 位系统)

下限 =-(2 ^ bit 系统) * 0.5 上限 = ((2 ^ bit 系统) * 0.5)-1