python字符串getsizeof()怎么计算的?

import sys
m=u"ab"
k=b"ab"
l="ab"
print(m,type(m),sys.getsizeof(m),"|",k,type(k),sys.getsizeof(k),"|",l,type(l),sys.getsizeof(l))

ab <class 'str'> 51 | b'ab' <class 'bytes'> 35 | ab <class 'str'> 51
怎样计算出51,和35的数字的?
谢谢

import sys
a=456
b=0
print(sys.getsizeof(a),sys.getsizeof(b))

28 24
我记得int是一种类型,为什么一种类型的变量占内存的大小还不一样啊?

阅读 18.1k
2 个回答

我以python3版本为例说明, int 类型在python中是动态长度的。因为python3中int类型是长整型,理论支持无限大的数字,但它的结构其实也很简单, 在 longintepr.h 中定义:

struct _longobject {
    PyObject_VAR_HEAD
    digit ob_digit[1];
};

这结构是什么意思呢,重点在于 ob_digit 它是一个数组指针。digit 可认为是 int 的别名。python的整型存储机制是这样的。比方要表示一个很大的数: 123456789 。而每个元素最大只能表示3位十进制数(为理解打的比方)。那么python就会这样存储:

ob_digit[0] = 789
ob_digit[1] = 456
ob_digit[2] = 123

低位存于低索引下。python中整型结构中的数组,每个元素最大存储 15 位的二进制数(不同位数操作系统有差异32位系统存15位,64位系统是30位)。

因此,sys.getsizeof(0) 数组元素为0。此时占用24字节(PyObject_VAR_HEAD 的大小)。 sys.getsizeof(456) 需使用一个元素,因此多了4个字节。有兴趣可以看看整型对象的分析: https://www.hongweipeng.com/i...

int对象还有很多方法和属性,而且在python中数字对象可以无限大下去,所以内存分配是在一个基础之上动态分配的。

同理你看下面的代码,一个道理,随着内容变多,内存占用自然变大,但是有一个个基础内存占用:

import sys
m=u"ab"
k=b"ab"
l="ab"

print(sys.getsizeof(u""))
print(sys.getsizeof(u"a"))
print(sys.getsizeof(b""))
print(sys.getsizeof(b"a"))

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏