Python字典的核心底层原理讲解

 更新时间:2019年01月24日 09:03:16   作者:Devin01213  
今天小编就为大家分享一篇关于Python字典的核心底层原理讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

字典对象的核心是散列表。散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫做 bucket。每个 bucket 有两部分:一个是键对象的引用,一个是值对象的引用。所有 bucket 结构和大小一致,我们可以通过偏移量来读取指定 bucket。下面通过存储与获取数据的过程介绍字典的底层原理。

存储数据的过程

例如,我们将‘name' = ‘张三' 这个键值对存储到字典map中,假设数组长度为8,可以用3位二进制表示。

>>> map = {}
>>> map
{}
>>> map['name'] = '张三'

1、计算name的散列值。

>>> bin(hash('name'))
'0b101011100000110111101000101010100010011010110010100101001000110'

2、用散列值的最右边 3 位数字作为偏移量,即“110”,十进制是数字 6。我们查看偏移量 6,对应的 bucket 是否为空。如果为空,则将键值对放进去。如果不为空,则依次取右移 3 位作为偏移量,即“000”,十进制是数字0,循环此过程,直到找到为空的 bucket 将键值对放进去。python 会根据散列表的拥挤程度扩容。“扩容”指的是:创造更大的数组,将原有内容拷贝到新数组中。接近 2/3 时,数组就会扩容。扩容后,偏移量的数字个数增加,如数组长度扩容到16时,可以用最右边4位数字作为偏移量。

获取数据的过程

>>> map.get('name')
'张三'

1、计算name的散列值

2、用最右边 3 位数字作为偏移量,即“110”,十进制是数字6。查看偏移量 6,对应的 bucket 是否为空。如果为空,则返回 None。如果不为空,则将这个 bucket 的键对象计算对应散列值,和我们的散列值进行比较,如果相等,则将对应“值对象”返回;如果不相等,则再依次取其他几位数字,重新计算偏移量。循环此过程。

小结:

1.键必须可散列,如数字、元组、字符串;自定义对象需要满足支持hash、支持通过__eq__()方法检测相等性、若 a==b 为真,则 hash(a)==hash(b)也为真。

>>> b = [1,2] //List不可散列
>>> bin(hash(b))
Traceback (most recent call last):
 File "<pyshell#90>", line 1, in <module>
  bin(hash(b))
TypeError: unhashable type: 'list'

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

3. 键查询速度很快;

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • Python list与NumPy array 区分详解

    Python list与NumPy array 区分详解

    这篇文章主要介绍了Python list与NumPy array 区分详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • Python使用requests模块发送http请求的方法介绍

    Python使用requests模块发送http请求的方法介绍

    Python Requests是一个 HTTP 库,它允许我们向 Web 服务器发送  HTTP 请求,并获取响应结果,本文将会详细介绍Python requests模块如何发送http请求,文中有相关的代码示例,需要的朋友可以参考下
    2023-06-06
  • 快速解释如何使用pandas的inplace参数的使用

    快速解释如何使用pandas的inplace参数的使用

    这篇文章主要介绍了快速解释如何使用pandas的inplace参数的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Python机器学习入门(二)之Python数据理解

    Python机器学习入门(二)之Python数据理解

    这篇文章主要介绍了Python机器学习入门知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • python中ThreadPoolExecutor线程池和ProcessPoolExecutor进程池

    python中ThreadPoolExecutor线程池和ProcessPoolExecutor进程池

    这篇文章主要介绍了python中ThreadPoolExecutor线程池和ProcessPoolExecutor进程池,文章围绕主题相关资料展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-06-06
  • 浅析Python中全局变量和局部变量的使用

    浅析Python中全局变量和局部变量的使用

    一个变量的名称除了可以代表不同的东西以外,也表示“哪里可以使用”这个变量,这篇文章将会介绍全局变量和局部变量的用法和差异,感兴趣的可以了解下
    2021-06-06
  • 用python实现学生信息管理系统

    用python实现学生信息管理系统

    这篇文章主要为大家详细介绍了用python实现学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • Python+OpenCV图片局部区域像素值处理详解

    Python+OpenCV图片局部区域像素值处理详解

    这篇文章主要为大家详细介绍了Python+OpenCV图片局部区域像素值处理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 在centos7中分布式部署pyspider

    在centos7中分布式部署pyspider

    PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI。采用Python语言编写,分布式架构,支持多种数据库后端,强大的WebUI支持脚本编辑器,任务监视器,项目管理器以及结果查看器。
    2017-05-05
  • Python+Mysql实现登录注册完整代码示例

    Python+Mysql实现登录注册完整代码示例

    在开发中用户注册和登录是常见的功能需求,这篇文章主要给大家介绍了关于Python+Mysql实现登录注册的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-03-03

最新评论