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

总结

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

相关文章

  • 解决Django生产环境无法加载静态文件问题的解决

    解决Django生产环境无法加载静态文件问题的解决

    这篇文章主要介绍了解决Django生产环境无法加载静态文件问题的解决,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • 在python中利用numpy求解多项式以及多项式拟合的方法

    在python中利用numpy求解多项式以及多项式拟合的方法

    今天小编就为大家分享一篇在python中利用numpy求解多项式以及多项式拟合的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python访问OPCUA服务器,订阅一个变量标签方式

    Python访问OPCUA服务器,订阅一个变量标签方式

    这篇文章主要介绍了Python访问OPCUA服务器,订阅一个变量标签方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Python自定义指标聚类实例代码

    Python自定义指标聚类实例代码

    K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一,下面这篇文章主要给大家介绍了关于Python自定义指标聚类的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • python数据可视化之初探 Seaborn

    python数据可视化之初探 Seaborn

    Seaborn 是一个基于 Matplotlib 的 Python 数据可视化库,它提供了更高级别的接口,使得创建美观的统计图形变得非常简单,在这篇文章中,我们将讨论 Seaborn 的基础使用方法,包括如何创建各种常见的统计图形
    2023-07-07
  • 浅谈Python Pygame图像的基本使用

    浅谈Python Pygame图像的基本使用

    今天给大家带来的是关于Python Pygame的相关知识,文章围绕着Pygame图像的基本使用展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Python用list或dict字段模式读取文件的方法

    Python用list或dict字段模式读取文件的方法

    这篇文章主要给大家介绍了Python利用list字段模式或者dict字段模式读取文件的方法,文中给出了详细的介绍和示例代码,相信对大家的理解和学习具有一定的参考借鉴价值,有需要的朋友可以跟着小编来一起学习学习吧。
    2017-01-01
  • python实现层次聚类的方法

    python实现层次聚类的方法

    层次聚类就是一层一层的进行聚类,可以由上向下把大的类别(cluster)分割,叫作分裂法,这篇文章主要介绍了python实现层次聚类的方法,需要的朋友可以参考下
    2021-11-11
  • Python实现位图分割的效果

    Python实现位图分割的效果

    目前网络上大多为用C++或者Matlab编写实现位图分割,所以本文将使用Python实现位图分割这一效果,代码简单易懂,感兴趣的小伙伴可以关注一下
    2021-11-11
  • python绘制条形图方法代码详解

    python绘制条形图方法代码详解

    这篇文章主要介绍了python绘制条形图方法代码详解,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12

最新评论