Python如何管理int和long?

luc*_*luc 106 python integer

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

  • 它是否动态选择正确的类型?
  • int的限制是什么?
  • 我使用的是Python 2.6,与以前的版本有什么不同?

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

>>> print type(65535)
<type 'int'>
>>> print type(65536*65536)
<type 'long'>
Run Code Online (Sandbox Code Playgroud)

更新:

>>> print type(0x7fffffff)
<type 'int'>
>>> print type(0x80000000)
<type 'long'>
Run Code Online (Sandbox Code Playgroud)

Ign*_*ams 111

int并且long"统一" 了几个版本.在此之前,可以通过数学运算溢出int.

3.x通过完全消除int并且只有很长时间来进一步提高它.

  • Python 2:sys.maxint包含Python int可以容纳的最大值.
    • 在64位Python 2.7上,大小为24字节.检查sys.getsizeof().
  • Python 3:sys.maxsize包含Python int可以的最大字节数.
    • 这将是32位的千兆字节,64位的艾字节.
    • 这样一个大的int将具有类似于8的幂的值sys.maxsize.

  • 但Python3将此类型称为"int",即使它的行为更像2.x的"long". (25认同)
  • Ted的评论:如下所述,请注意将某些内容转换为大于maxint的int仍然会导致长>>> type(int(sys.maxint + 1))<type'long'> (3认同)
  • 在python3中,它是sys.maxsize (3认同)
  • sys.maxsize与整数无关.Python 3的sys.maxint已被删除,因为整数没有最大大小(Python 3的`int`与Python 2的`long`相同). (3认同)
  • sys.maxint将为您提供最大的64位整数(在我的64位机器上)一个Long可以大得多64位,只需尝试"sys.maxint << 1000000" (2认同)
  • 我有点困惑。在我的 64 位 Windows 系统上, sys.maxint 产生 2^31 -1。 (2认同)
  • @noɥʇʎudʎzɐɹƆ您混淆了“最大整数”和“最大大小”。最大大小是字节数。在 64 位机器上,虚拟内存具有 64 位宽的地址,但我们将保留 1 位用于符号,1 个值用于空地址,这样就为我们提供了 2**63 - 1 个可寻址字节。即 9223372036854775807。 python3 整数不限于 64 位硬件,并且可以处理(在软件中)大于 64 位的数字。 (2认同)

mlu*_*bke 15

这个PEP应该有所帮助.

底线是你真的不应该在python版本> 2.4中担心它

  • 如果必须在c中使用不适合int的东西(即long)调用int函数,则必须担心它.没有多少铸造long-> int会有所帮助.最近发生在我身上. (14认同)
  • @Macke:这个评论救了我,我认为 int 可以解决问题,并且想知道为什么我仍然收到 Jython 异常。 (2认同)

小智 6

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

Python 2 中默认 Int 的 Max 值为 65535,高于此值的任何值都会很长

例如:

>> print type(65535)
<type 'int'>
>>> print type(65536*65536)
<type 'long'>
Run Code Online (Sandbox Code Playgroud)

在 Python 3 中,long 数据类型已被删除,所有整数值都由 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 将自动更改它的类型并分配更多内存来处理这种最小值/最大值的增加。在 Python 2 中,它会转换为“long”,现在它只是转换为 Int 的下一个大小。

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

有多种方法可以检查 int 的大小及其内存分配。注意:在 Python 3 中,<class 'int'>无论您使用什么大小的 Int ,使用内置的 type() 方法都将始终返回。


MAK*_*MAK 5

在我的机器上:

>>> print type(1<<30)
<type 'int'>
>>> print type(1<<31)
<type 'long'>
>>> print type(0x7FFFFFFF)
<type 'int'>
>>> print type(0x7FFFFFFF+1)
<type 'long'>
Run Code Online (Sandbox Code Playgroud)

Python使用整数(32位有符号整数,我不知道它们是否是C整数)适合适合32位的值,但是对于任何东西,它都会自动切换为长整数(任意大的位数,即bignums)更大。我猜想这将加快速度以实现较小的值,同时通过无缝过渡到bignum避免任何溢出。