在PyCharm中测试下面的代码:
# 计算1x2x3x...x100:
acc = 1
n = 1
while n <= 100:
acc = acc * n
n = n + 1
print(acc)
打印结果如下:
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
居然没有溢出, 这让我挺意外! 那么Python中整型变量的长度到底是多少呢? 为什么能容纳这么大的数值呢? C语言和Java语言中整型变量一般为4字节或8字节, 对于C和Java来说存储这么大的数值早就应该溢出了. 看来Python在这一点上与C和Java是不同的。
使用下面的代码打印一下acc, 0以及1的字节数:
print(sys.getsizeof(acc))
print(sys.getsizeof(0))
print(sys.getsizeof(1))
结果分别是96, 24, 28.
还是不太理解这是为什么, 网上查了下答案,这与Python底层保存整型变量的结构有关系,Python底层保存整型变量的结构如下:
struct PyLongObject{
long ob_refcnt; // 引用计数,64位系统占8 bytes, 32位系统占4 bytes
struct_typeobject *ob_type; // 类型指针,64位系统占8 bytes, 32位系统占4 bytes
long ob_size; // 数据部分int的个数,64位系统占8 bytes, 32位系统占4 bytes
unsigned int ob_digit[1]; // 64位系统占4 bytes * abs(ob_size); 32位系统占2 bytes * abs(ob_size);
};
对于64位Python:
ob_refcnt,ob_type,ob_size各占8字节。当ob_size为0时,ob_digit不存在,否则其字节数为4*abs(ob_size),所以最少为8*3=24字节,而且每次增量都是4的倍数。
对于32位Python:
ob_refcnt,ob_type,ob_size各占4字节。当ob_size为0时,ob_digit不存在,否则其字节数为2*abs(ob_size),所以最少为4*3=12字节,而且每次增量都是2的倍数。
采用这种处理方式,Python的整型变量基本上可做到无长度限制。