问题: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'>
回答 0
int
并long
“统一” 了几个版本。在此之前,可以通过数学运算来溢出int。
3.x通过完全消除long而仅具有int来进一步提高了此功能。
- Python 2:
sys.maxint
包含Python int可以容纳的最大值。- 在64位Python 2.7上,大小为24个字节。用检查
sys.getsizeof()
。
- 在64位Python 2.7上,大小为24个字节。用检查
- Python 3:
sys.maxsize
包含Python int可以达到的最大字节数。- 这将是32位的千兆字节和64位的EB。
- 如此大的int的值将等于8的幂
sys.maxsize
。
回答 1
该PEP应该有所帮助。
最重要的是,在python版本> 2.4中,您真的不必担心它
回答 2
在我的机器上:
>>> print type(1<<30)
<type 'int'>
>>> print type(1<<31)
<type 'long'>
>>> print type(0x7FFFFFFF)
<type 'int'>
>>> print type(0x7FFFFFFF+1)
<type 'long'>
Python使用整数(32位带符号整数,我不知道它们是否是C整数)适合适合32位的值,但是对于任何东西,它都会自动切换为长整数(任意大的位数,即bignums)更大。我猜想这将加快速度以提供较小的值,同时通过无缝过渡到bignum避免任何溢出。
回答 3
有趣。在我的64位(i7 Ubuntu)盒子上:
>>> print type(0x7FFFFFFF)
<type 'int'>
>>> print type(0x7FFFFFFF+1)
<type 'int'>
猜猜它在更大的机器上提升到64位整数。
回答 4
Python 2.7.9自动提升数字。对于不确定使用int()或long()的情况。
>>> a = int("123")
>>> type(a)
<type 'int'>
>>> a = int("111111111111111111111111111111111111111111111111111")
>>> type(a)
<type 'long'>
回答 5
Python 2将根据值的大小自动设置类型。最大值指南可在下面找到。
Python 2中默认Int的Max值为65535,任何高于此值的值都会很长
例如:
>> print type(65535)
<type 'int'>
>>> print type(65536*65536)
<type 'long'>
在Python 3中,长数据类型已被删除,所有整数值都由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,340282366920938938463463374607431768211455]
如果您的Int大小超过上述限制,python将自动更改其类型并分配更多内存以处理此最小值/最大值的增加。在Python 2中,它将转换为“ long”,现在仅转换为下一个Int大小。
示例:如果您使用的是32位操作系统,则Int的最大值默认为2147483647。如果分配的值为2147483648或更大,则类型将更改为Int64。
有多种方法可以检查int的大小及其内存分配。注意:在Python 3中,<class 'int'>
无论您使用的是什么Int大小,使用内置的type()方法总是会返回。
回答 6
从python 3.x开始,统一整数库比旧版本更加智能。在(i7 Ubuntu)盒子上,我得到了以下信息:
>>> type(math.factorial(30))
<class 'int'>
有关实现的详细信息,请参见Include/longintrepr.h, Objects/longobject.c and Modules/mathmodule.c
文件。最后一个文件是动态模块(编译为so文件)。该代码很好地遵循。
回答 7
只是为了继续这里给出的所有答案,尤其是@James Lanes
整数类型的大小可以通过以下公式表示:
总范围=(2 ^位系统)
下限=-(2 ^位系统)* 0.5上限=((2 ^位系统)* 0.5)-1
回答 8
它管理着他们,因为int
和long
是同级类定义。它们具有用于+,-,*,/等的适当方法,这些方法将产生适当类的结果。
例如
>>> a=1<<30
>>> type(a)
<type 'int'>
>>> b=a*2
>>> type(b)
<type 'long'>
在这种情况下,该类int
具有一个__mul__
方法(实现*的方法),该方法可long
在需要时创建结果。