自由式学习
993人加入学习
(0人评价)
Python基础知识-pycharm版
价格 免费
承诺服务
该课程属于 1443-李同学-算法方向-计算机视觉-就业:是 请加入后再学习

根据键查找‘键值对’的底层过程

a.get('name')

第一步,我们计算'name'对象的散列值:

bin(hash('name'))

和存储的底层流程算法一致。取散列值不同位置的数字,然后查看偏移量对应的bucket是否为空。如果为空,返回None。如果不为空,则将这个bucket的键对象计算对应散列值,和我们的散列值进行比较。相等则返回对应'值对象'。不相等,则重新计算偏移量。依次取完后仍然没找到,则返回None。

[展开全文]

根据键查找“键值对”的底层过程

当我们调用a.get(“name”),就是根据键“name”查找到“键值对”,从而找到值
对象“gaoqi”。


1.计算“name”对象的散列值:
>>> bin(hash("name"))
'-0b1010111101001110110101100100101'


2.假设数组长度为8

3.拿计算出的散列值的最右边3 位数字作为偏移量,即“101”,十进制是数字5

4.我们查看偏移量5,对应的bucket 是否为空。如果为空,则返回None。如果不为空,则将这个bucket 的键对象计算对应散列值,和我们的散列值进行比较,如果相等。则将对应“值对象”返回。如果不相等,则再依次取其他几位数字,重新计算偏移量。

5.依次取完后,仍然没有找到。则返回None

 

用法总结:
1. 键必须可散列
(1) 数字、字符串、元组,都是可散列的。
(2) 自定义对象需要支持下面三点:
1 支持hash()函数
2 支持通过__eq__()方法检测相等性。
3 若a==b 为真,则hash(a)==hash(b)也为真。

2. 字典在内存中开销巨大,典型的空间换时间。
3. 键查询速度很快
4. 往字典里面添加新建可能导致扩容,导致散列表中键的次序变化。因此,不要在遍历字
典的同时进行字典的修改。(建议先遍历,取出需要修改的,再修改)

[展开全文]