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


Posted in Python onJanuary 24, 2019

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

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

存储数据的过程

例如,我们将‘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位数字作为偏移量。

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

获取数据的过程

>>> 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 相关文章推荐
Python编程中运用闭包时所需要注意的一些地方
May 02 Python
python实现简单遗传算法
Mar 19 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
May 15 Python
TensorFlow 合并/连接数组的方法
Jul 27 Python
Python基础之文件读取的讲解
Feb 16 Python
Docker部署Python爬虫项目的方法步骤
Jan 19 Python
python函数enumerate,operator和Counter使用技巧实例小结
Feb 22 Python
详解用Python进行时间序列预测的7种方法
Mar 13 Python
基于virtualenv创建python虚拟环境过程图解
Mar 30 Python
基于Keras的格式化输出Loss实现方式
Jun 17 Python
Python虚拟环境的创建和包下载过程分析
Jun 19 Python
树莓派4B安装Tensorflow的方法步骤
Jul 16 Python
使用PIL(Python-Imaging)反转图像的颜色方法
Jan 24 #Python
Python3实现取图片中特定的像素替换指定的颜色示例
Jan 24 #Python
python 实现图片旋转 上下左右 180度旋转的示例
Jan 24 #Python
Python对象与引用的介绍
Jan 24 #Python
selenium+python自动化测试之多窗口切换
Jan 23 #Python
python 去除二维数组/二维列表中的重复行方法
Jan 23 #Python
selenium+python自动化测试之鼠标和键盘事件
Jan 23 #Python
You might like
历史证明,懒惰才是推动科学发展技术进步的动力
2021/03/02 无线电
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
2016/12/07 PHP
javascript instanceof 与typeof使用说明
2010/01/11 Javascript
基于JQuery.timer插件实现一个计时器
2010/04/25 Javascript
javascript使用location.search的示例
2013/11/05 Javascript
使用命令对象代替switch语句的写法示例
2015/02/28 Javascript
jQuery实现鼠标悬停显示提示信息窗口的方法
2015/04/30 Javascript
只需五句话搞定JavaScript作用域(经典)
2016/07/26 Javascript
浅谈js中function的参数默认值
2017/02/20 Javascript
基于jquery实现多级菜单效果
2017/07/25 jQuery
vue跨域解决方法
2017/10/15 Javascript
JavaScript实现的联动菜单特效示例
2019/07/08 Javascript
js中addEventListener()与removeEventListener()用法案例分析
2020/03/02 Javascript
javascript设计模式 ? 享元模式原理与用法实例分析
2020/04/15 Javascript
基于JavaScript实现大文件上传后端代码实例
2020/08/18 Javascript
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
2018/01/10 Python
基于python log取对数详解
2018/06/08 Python
python skimage 连通性区域检测方法
2018/06/21 Python
pandas.dataframe按行索引表达式选取方法
2018/10/30 Python
Python小白必备的8个最常用的内置函数(推荐)
2019/04/03 Python
python利用selenium进行浏览器爬虫
2019/04/25 Python
更新pip3与pyttsx3文字语音转换的实现方法
2019/08/08 Python
python线程中的同步问题及解决方法
2019/08/29 Python
使用Tensorflow实现可视化中间层和卷积层
2020/01/24 Python
利用Python实现自动扫雷小脚本
2020/12/17 Python
德国传统玻璃制造商:Cristalica
2018/04/23 全球购物
中东最大的在线宠物店:Dubai Pet Food
2020/06/11 全球购物
小学优秀教育工作者事迹材料
2014/05/09 职场文书
2014年党员加强作风建设思想汇报
2014/09/15 职场文书
2014年乡镇民政工作总结
2014/12/02 职场文书
雾霾停课通知
2015/04/24 职场文书
JS如何使用剪贴板操作Clipboard API
2021/05/17 Javascript
OpenCV-Python实现油画效果的实例
2021/06/08 Python
html实现弹窗的实例
2021/06/09 HTML / CSS
python 多态 协议 鸭子类型详解
2021/11/27 Python
浅谈Node的内存泄露问题
2022/05/06 NodeJs