You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:50:14