文章目录
41.根据’键’查找“键值对”的底层过程
我们明白了,一个键值对是如何存储到数组中的,根据键对象取到值对象,
理解起来就 简单了。
>>> a.get("name")
'onepis'
当我们调用a.get(“name”)
,就是根据键“name”查找到“键值对”,从而找到值 对象“onepis”
。
第一步,我们仍然要计算“name”对象的散列值:
>>> bin(hash("name"))
'-0b1010111101001110110101100100101'
和存储的底层流程算法一致,也是依次取散列值的不同位置的数字。
假设数组长度为 8,我们可以拿计算出的散列值的最右边 3位数字作为偏移量,即“101”,十进制是数字 5。
我们查看偏移量 5,对应的bucket
是否为空。
如果为空,则返回None
。
如果不为空, 则将这个bucket
的键对象计算对应散列值,和我们的散列值进行比较,如果相等。
则将对 应“值对象”返回。如果不相等,则再依次取其他几位数字,重新计算偏移量。
依次取完后, 仍然没有找到。则返回 None。流程图如下:
用法总结:
- 键必须可散列
数字、字符串、元组,都是可散列的
。- 自定义对象需要支持下面三点:
- 支持
hash()
函数 - 支持通过
\_\_eq__()
方法检测相等性。 - 若
a==b
为真,则hash(a)==hash(b)
也为真。
- 支持
- 自定义对象需要支持下面三点:
字典
在内存中开销巨大,典型的空间换时间
。键查询速度很快
- 往字典里面添加新建可能
导致扩容
,导致散列表中键的次序变化。因此,不要在遍历字 典的同时进行字典的修改
。