Python 字典基于哈希表 + 开放寻址法实现。核心流程:对 key 调用 hash() 得到哈希值,取低位映射到哈希槽索引;若槽被占(冲突),按探测序列(扰动哈希值后线性/伪随机探测)找下一个空槽,而非链表法。查找同理:按相同探测序列比较 key,命中或遇空槽停止。
关键设计:
- 装载因子:通常保持在 2/3 以下,超过即扩容重建(rehash),保证平均 O(1)。
- 哈希与相等契约:key 必须可哈希;
hash(a) == hash(b)是a == b的必要条件,所以重写__eq__一般必须配套重写__hash__。 - 3.6 起的紧凑字典:数据改为两部分——一个稀疏的索引数组(存偏移)+ 一个按插入顺序紧凑排列的 entries 数组。内存显著减小,遍历时顺序天然等于插入顺序,于是 3.7 起"字典保序"成为语言规范。
易错点:hash 内置对 str/bytes 有随机化(防哈希洪水攻击),不同进程哈希值不同;可变对象不可作 key(list、dict 无 __hash__);性能分析要说"平均 O(1)",冲突严重时理论最坏 O(n)。追问方向:探测序列细节、哈希洪水攻击与 PYTHONHASHSEED、紧凑字典如何省内存。