Python中的Dict底层 | 字典类型删除数据为什么不直接删除?

Python中的dict字典类型是通过散列表或者说hash表实现的
如果出现hash碰撞,采用开放寻址法
开放寻址法中,所有的元素都存放在散列表里,当产生哈希冲突时,通过一个探测函数计算出下一个候选位置,如果下一个获选位置还是有冲突,那么不断通过探测函数往下找,直到找个一个空槽来存放待插入元素。

添加元素

把key通过哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里

查找元素

使用哈希函数将key转换为对应的数组下标,并定位到数组的位置获取value。

删除元素

采用伪删除的方式,当删除一个元素的时候,不直接删除,而是标记为已删除
不能直接删除的原因:如果存在a,b哈希碰撞的情况,把a直接删除了的话,下一次查询b的时候,散列到a的位置时,发现为空会直接返回b不在字典中,b就会永远也找不到;所以采用标记的方法,当b散列到a的位置时,发现被标记为已删除,就会根据探测函数寻找下一个位置,直到找到。ab就相当于一个探测链,如果a删除了,b就永远也找不到了。

原文地址:https://www.cnblogs.com/leerep/p/13543635.html