Python中dict()与{}创建字典的内存差异及扩容疑问
Python 3.8中空字典字面量
{}首次插入元素时内存骤增的原因 先明确你观察到的核心现象:
- 创建空字典有两种方式:字面量
{}和dict()函数。用sys.getsizeof()检测,空{}占用64字节(包含8个空桶,每个8字节),而dict()创建的空字典占用232字节,这源于二者底层实现机制不同。 - 疑惑点:用
{}创建的空字典首次添加元素时,内存直接从64字节跃升至232字节,明明Python哈希表是填充到2/3时才会扩容,为什么首次插入就触发内存骤增?
背后的原因
Python 3.8中,空字典字面量{}对应的是紧凑型空字典(empty dict stub)——这是一个专门优化内存的轻量级结构,它只包含字典最基础的元数据和8个空桶,但没有为存储键值对的条目数组分配空间,所以初始内存占用极低。
当你第一次向这个紧凑型空字典插入元素时,Python会自动将它升级为标准的字典结构——也就是和dict()创建的空字典完全一致的结构。这个标准结构不仅包含哈希桶数组,还预分配了8个键值对的条目空间,再加上字典的其他元数据(比如当前大小、哈希掩码、哈希种子等),总内存占用刚好是232字节。
而dict()函数创建的空字典,从一开始就是标准结构,已经准备好了条目空间,所以初始就占用232字节,后续插入元素时,只有当填充率达到2/3的负载因子时,才会触发哈希表的扩容操作。
验证代码
import sys # 空字面量字典 empty_literal = {} print(f"空{{}}的内存占用: {sys.getsizeof(empty_literal)}字节") # 输出64 # 插入第一个元素 empty_literal["key"] = "value" print(f"插入第一个元素后的内存占用: {sys.getsizeof(empty_literal)}字节") # 输出232 # dict()创建的空字典 empty_dict_func = dict() print(f"dict()创建的空字典内存占用: {sys.getsizeof(empty_dict_func)}字节") # 输出232
总结
- 空
{}是Python为节省内存设计的轻量级 stub 结构,仅用于表示空字典,不支持直接插入元素; - 首次插入元素时会触发结构升级,转为完整的标准字典结构,因此内存占用骤增;
- 后续插入元素时,才会遵循哈希表2/3负载因子的扩容规则。
内容的提问来源于stack exchange,提问作者ARAT
相关产品推荐
相关产品推荐

