Python 第四节 第六课

[toc]

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

   我们明白了, 一个键值对是如何存储到数组中的, 根据键对象取到值对象, 理解起来就简单了.

        >>> a.get("name")

        >>> "我是小白"

    当我们调用 a.get( "name" ), 就是根据键 "name" 查找到 "键值对", 而从找到值对象 "我是小白".

    第一步, 我们仍然要计算 "name" 对象的散列值:

         >>>bin(hash("name"))

         0b100000111110100101100111000111101100110100111111000000110100101

    和存储的底层流程算法一致, 也是依次取散列值的不同位置的数字. 假设数组长度为 8 , 我们可以拿计算出的散列值的最右边 3 位数作为偏移量, 即 "101", 十进制是数字 5. 我们查看偏移量 5, 对应的 bucket 是否为空. 如果为空, 则返回 None. 如果不为空, 则将这个 bucket 的键值对象计算对应的散列值, 和我们的散列值进行比较, 如果相等. 则对应 "值对象" 返回. 如果不相等, 则再依次取其他几位数字, 重新计算偏移量. 依次取完后, 任然没有找到. 则返回 None. 流程如下:

用法总结:

1. 键必须可散列

    (1) 数字, 字符串, 元组, 都是可以散列的.

    (2) 自定义对象需要支持下面三点:

  • 支持 hash() 函数

  • 支持通过__eq__() 方法检测相等性

  • 若 a == b 为真, 则 hash(a) == hash(b) 也为真

2. 字典在内存中开销巨大, 典型的空间换时间.

3. 键查询速度很快

4. 往字典里面添加新建可能导致扩容, 导致散列表在键次序变换. 因此, 不要在遍历字典的同时进行字典的修改.

©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页