python字典

说说Python中字典的底层是怎么实现的?

1.相关概念

  • Python 字典的底层实现是哈希表。调用python内置的哈希函数,将键(Key)作为参数进行转换(哈希运算+取余运算),得到一个唯一的地址(地址的索引),然后将值(Value)存放到对应地址中(给相同的键赋值会直接覆盖原值,因为相同的键转换后的地址是一样的)。
  • 哈希表(Hash Table,又称为散列表)是一种线性表的存储结构。由一个直接寻址表 T (假设大小为m) 和一个哈希函数 h(k) 组成。对于任意可哈希对象,通过哈希函数(一般先进行哈希计算,然后对结果进行取余运算),将该对象映射为寻址表的索引 [0,1,2,…m-1],然后在该索引所对应的空间 T[0,1,2,…,m-1] 进行变量的存储/读取等操作。

图片2

注:键(Key)必须是可哈希的,即,通过哈希函数可为此键计算出唯一地址。
  • 对于 Python 来说,变量,列表、字典、集合这些都是可变的,所以都不能做为键(Key)来使用。Python 的哈希算法对相同的值计算得到的结果是一样的,也就是说 123 和 123.0 的值相同,他们被认为是相同的键(Key)。

2.哈希冲突

  • 由于哈希表的大小是有限的,而要存储的值的总数量是无限的,因此对于任何哈希函数,都会出现两个不同元素映射到同一个位置上的情况,这种情况叫做哈希冲突。字典使用了开放寻址法来解决冲突。
开放寻址法:如果哈希函数返回的位置已经有值,则可以探查新的空位置来存储这个值。

图片3

3.python中字典的操作

  • 插入: 对键进行哈希和取余运算,得到一个哈希表的索引,如果该索引所对应的表地址空间为空,将键值对存入该地址空间;
  • 查询/更新:对键进行哈希和取余运算,得到一个哈希表的索引,如果该索引所对应的地址空间中键与要查询/更新的键一致,那么就将该键值对取出来 / 更新该键所对应的值;
  • 扩容:在特定条件下自动进行扩容,以保证字典的操作效率(如插入、查询的平均时间复杂度维持在 O(1))。扩容的触发条件:
    字典的扩容行为与 “负载因子”(load factor)密切相关。负载因子的计算公式为:
    负载因子 = 字典中键值对的数量 / 哈希表的容量
    Python 字典会维护一个负载因子阈值(默认通常为 2/3)。当插入新键值对后,负载因子超过该阈值时,字典会触发扩容,这时候会对已经存在的键值对 重新进行哈希取余运算(重新进行插入操作)保存到其它位置。
posted @ 2025-10-21 16:17  我会替风去  阅读(16)  评论(0)    收藏  举报