以python3版本为例说明, int 类型在python中是动态长度的。因为python3中int类型是长整型,理论支持无限大的数字,但它的结构其实也很简单, 在 longintepr.h 中定义:
struct _longobject { PyObject_VAR_HEAD digit ob_digit[1]; };这结构是什么意思呢,重点在于 ob_digit 它是一个数组指针。digit 代表的是是python中的 int。python中整型结构中的数组,每个元素最大存储 15 位的二进制数(不同位数操作系统有差异32位系统存15位,64位系统是30位)。
# 此处以64位系统为例 import sys # 起始长度位24B(PyObject_VAR_HEAD 的大小) # 10进制数所表示的二进制数未超过30位时,长度为28B = 24B + 4B # 10进制数所表示的二进制数超过30位而未超过60位时,长度为32B = 28B + 4B # 以此类推 print('0'.center(20, '=')) print(sys.getsizeof(0)) # 使用了24B(PyObject_VAR_HEAD 的大小) print('1'.center(20, '=')) print(sys.getsizeof(1)) # 二进制未超过30位,使用了28B = 24B + 4B print('1 << 29'.center(20, '=')) print(sys.getsizeof(1 << 29)) # 二进制未超过30位,使用了28B = 24B + 4B print('1 << 30'.center(20, '=')) print(sys.getsizeof(1 << 30)) # 二进制超过30位而未超过60位,使用了32B = 28B + 4B print('1 << 59'.center(20, '=')) print(sys.getsizeof(1 << 59)) # 二进制超过30位而未超过60位,使用了32B = 28B + 4B print('1 << 60'.center(20, '=')) print(sys.getsizeof(1 << 60)) # 二进制超过60位而未超过90位,使用了36B = 32B + 4B """ 运行结果如下: =========0========== 24 =========1========== 28 ======1 << 29======= 28 ======1 << 30======= 32 ======1 << 59======= 32 ======1 << 60======= 36 Process finished with exit code 0 """