You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python中列表内存占用为何不等于其元素总内存占用?

为什么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

火山引擎 最新活动