定义
字典结构体的定义在文件Include/cpython/dictobject.h
具体内容:
1 | |
而存储键值对的结构,PyDictKeysObject,即_dictkeysobject,定义在Objects/dict-common.h中
1 | |
1 | |
内存结构图如下

hash冲突
当某俩个不同的key,计算的hash一样的时候,就产生了hash冲突。 产生hash冲突的时候,就需要解决冲突,一般有以下的思路
- 用某种方法再找个地址,直到没有冲突,这个思路下有以下方法
- 将key用其他方式再hash
- 查找这个地址之前/之后的可用地址 以上新增时可能会增加时间,比如出发扩容和多次查找会很耗时,但是访问速度快,可以序列化
- 将这些冲突的key,额外存储下
- 用一个链表/红黑树存储这些key,适合经常插入和删除,访问的时间可能会增加
- 建立公共益处区,专门存储冲突的key
dict的各个接口函数的实现,都在文件Objects/dictobject.c文件中,
一般都是创建dict和给dict添加元素的时候,就会遇到hash冲突,所以可以直接观察插入元素的实现逻辑,从中看看python如何解决hash冲突的
1 | |
没有直接查找到dk_lookup的直接实现,是在实际调用中,给dk_lookup赋值为各种lookdict函数
1 | |
通过上面的源码,看出来,python使用了实现起来最简单的开放地址法解决冲突,果然时刻践行着”怎么简单怎么来”的思想