Python3中整型变量的长度

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

l_z_h

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值