请记住,Python
int类型没有C那样有限的范围
int。唯一的限制是可用内存。
内存用于存储值,整数存储的当前大小(存储大小可变以支持任意大小)以及标准的Python对象簿记(对相关对象的引用和引用计数)。
您可以查找
longintrepr.h源代码(Python
3类型在Python
2中
int传统上称为
long类型)。它有效地利用了
PyVarObjectC类型来跟踪整数大小:
struct _longobject { PyObject_VAR_HEAD digit ob_digit[1];};该
ob_digit数组存储“数字”宽15个或30比特的(取决于你的平台上); 因此在我的64位OS X系统上,最大(2 ^
30)-1的整数使用1个“数字”:
>>> sys.getsizeof((1 << 30) - 1)28
但是如果您在数字中使用2个30位数字,则需要额外的4个字节,依此类推:
>>> sys.getsizeof(1 << 30)32>>> sys.getsizeof(1 << 60)36>>> sys.getsizeof(1 << 90)40
然后,基数为24的字节是
PyObject_VAR_HEAD结构,其中包含对象大小,引用计数和类型指针(在我的64位OS X平台上为每个8字节/
64位)。
在Python 2上,整数<=
sys.maxint但> =
-sys.maxint -1使用仅存储单个值的简单结构存储:
typedef struct { PyObject_HEAD long ob_ival;} PyIntObject;因为它使用
PyObject而不是结构中
PyVarObject没有
ob_size字段,并且内存大小限制为仅24个字节;8表示
long值,8表示引用计数,8表示类型对象指针。



