小白学python第1问: int 占几个字节?
int 占几个字节?C语言中(GCC编译器),int 占据4个字节,python呢?
28个字节! 也就是说 int 是占据 28个字节吗? 再看看下面的
又多了4个字节! sys.getsizeof(2**30-1)
这是什么原因呢,百撕不得骑姐啊;stackoverflow的这篇文章给出了答案。 https://stackoverflow.com/questions/449560/how-do-i-determine-the-size-of-an-object-in-python 我们直接看 Aaron Hall 给出的答案:
也就是说 int 类型,每2 ** 30增加4个字节。 我们试试 sys.getsizeof(2**60)
没问题,是这个理儿 那python是怎么做到让 int 占据的字节大小可变长而不报错的呢? 具体地,我们看一下python的相关源码(我的是python3.7.4) 源文件:Include/longintrepr.h /* Long integer representation.
The absolute value of a number is equal to
SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i)
Negative numbers are represented with ob_size < 0;
zero is represented by ob_size == 0.
In a normalized number,ob_digit[abs(ob_size)-1] (the most significant
digit) is never zero. Also,in all cases,for all valid i,0 <= ob_digit[i] <= MASK.
The allocation function takes care of allocating extra memory
so that ob_digit[0] ... ob_digit[abs(ob_size)-1] are actually available.
CAUTION: Generic code manipulating subtypes of PyVarObject has to
aware that ints abuse ob_size's sign bit.
*/
struct _longobject {
PyObject_VAR_HEAD
digit ob_digit[1];
};
PyObject_VAR_HEAD 是所有python对象共有的头部,更多内容可参阅 《python源码剖析》相关章节,这里不展开了,需要说明的是 这个头部对象里面有个 ob_size 指明了可变部分的长度。 也因为这个设计,python3.7没有long类型只有int类型,int实际上就是值无限大(不能超出虚拟内存大小)的long。具体为什么要把int和long合并到一起,这是我们下一问了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |





