Python中列表内存占用为何不等于其元素总内存占用?
sys.getsizeof()结果小于所有元素字节数总和? 这个问题问得很到位,核心原因其实和Python列表的存储机制,以及sys.getsizeof()的工作逻辑直接相关,我给你拆解清楚:
列表本质是存储元素的引用,而非元素本身
Python的列表是基于动态数组实现的,但它并不会把元素的数据直接存在列表的内存块里。列表里存储的其实是指向各个元素对象的指针(在64位系统中,每个固定占8字节)。也就是说,列表对象自身的内存,只包含列表的基础管理信息(比如当前长度、已分配容量、指针数组的起始地址等),加上这些指针的空间——完全不包含元素对象本身占用的内存。sys.getsizeof()只计算对象自身的内存,不包含引用的对象
这个函数的设计逻辑就是:只返回调用它的那个对象的内存占用,不会递归计算它所引用的其他对象。比如你调用sys.getsizeof(my_list),得到的只是这个“容器”本身的大小,而列表里的每个元素是独立的对象,它们的内存是单独分配在其他内存区域的,不会被算进列表的sizeof结果里。
举个实际的测试例子(64位Python环境下):
import sys my_list = [1, 2, 3] list_size = sys.getsizeof(my_list) element_total = sum(sys.getsizeof(x) for x in my_list) print(f"列表本身大小: {list_size} 字节") print(f"所有元素总大小: {element_total} 字节")
运行后你会发现,列表本身的大小大概在64字节左右(空列表基础结构40字节 + 3个指针×8字节),而每个小整数对象在Python中占用28字节,三个元素总大小是84字节——显然列表本身的大小远小于元素总和。
如果想要计算列表加上所有元素的总内存占用,你需要自己实现一个递归的内存计算函数,遍历列表里的每个元素(如果元素是容器类型,还要继续递归遍历内部元素),累加所有对象的sys.getsizeof()结果。
内容的提问来源于stack exchange,提问作者Anh Tú Mai




