Python3中整型变量的长度

Python3中整型变量的长度,第1张

在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的整型变量基本上可做到无长度限制。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/570050.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存