Python 第四节 第六课

举报
我是小白呀iamarookie 发表于 2021/09/11 00:51:15 2021/09/11
【摘要】 [toc] 根据键查找 "键值对" 的底层过程    我们明白了, 一个键值对是如何存储到数组中的, 根据键对象取到值对象, 理解起来就简单了.         >>> a.get("name")        ...

[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. 往字典里面添加新建可能导致扩容, 导致散列表在键次序变换. 因此, 不要在遍历字典的同时进行字典的修改.

文章来源: iamarookie.blog.csdn.net,作者:我是小白呀,版权归原作者所有,如需转载,请联系作者。

原文链接:iamarookie.blog.csdn.net/article/details/108841478

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。