摘抄自 Python字典dict实现原理
python3.6 之前
dict 底层由一个列表实现,
enteies = [
['--', '--', '--'],
[hash1, key1, value1],
['--', '--', '--'],
['--', '--', '--'],
[hash2, key2, value2],
]
计算key的hash值hash(key),再和mask做与操作【mask=字典最小长度(DictMinSize) - 1】,运算后会得到一个数字index,这个index就是要插入的enteies哈希表中的下标位置
若index下标位置已经被占用,则会判断enteies的key是否与要插入的key是否相等如果key相等就表示key已存在,则更新value值如果key不相等,就表示 hash冲突 ,则会继续向下寻找空位置,一直到找到剩余空位为止。
随着数据插入, 空白位置减少, 当小于三分之一时, 会增加存储空间.
字典的三个基本操作(添加元素,获取元素和删除元素)的平均事件复杂度为 O(1)。
Python中所有不可变的内置类型都是可哈希的。
可变类型(如列表,字典和集合)就是不可哈希的,因此不能作为字典的键。
python3.7 之后
新字典还使用了一张Indices表来辅助。下来列出新的结构:
indices = [None, None, index, None, index, None, index]
enteies = [
[hash0, key0, value0],
[hash1, key1, value1],
[hash2, key2, value2]
]
计算key的hash值【hash(key)】,再和mask做与操作【mask=字典最小长度(IndicesDictMinSize) - 1】,运算后会得到一个数字【index】,这个index就是要插入的indices的下标位置(注:具体算法与Python版本相关,并不一定一样)得到index后,会找到indices的位置,但是此位置不是存的hash值,而是存的len(enteies),表示该值在enteies中的位置如果出现hash冲突,则处理方式与老字典处理方式类似.