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多线程下的变量问题
Apr 28 Python
最大K个数问题的Python版解法总结
Jun 16 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
Nov 06 Python
在Python中实现shuffle给列表洗牌
Nov 08 Python
python开发之anaconda以及win7下安装gensim的方法
Jul 05 Python
Python3从零开始搭建一个语音对话机器人的实现
Aug 23 Python
解决Pycharm中恢复被exclude的项目问题(pycharm source root)
Feb 14 Python
python zip,lambda,map函数代码实例
Apr 04 Python
解决keras模型保存h5文件提示无此目录问题
Jul 01 Python
使用Keras训练好的.h5模型来测试一个实例
Jul 06 Python
Python3使用 GitLab API 进行批量合并分支
Oct 15 Python
利用python绘制正态分布曲线
Jan 04 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
php5.2.0内存管理改进
2007/01/22 PHP
Composer设置忽略版本匹配的方法
2016/04/27 PHP
PHP Header失效的原因分析及解决方法
2016/11/16 PHP
让JavaScript拥有类似Lambda表达式编程能力的方法
2010/09/12 Javascript
深入理解JavaScript作用域和作用域链
2011/10/21 Javascript
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
2013/05/15 Javascript
input链接页面、打开新网页等等的具体实现
2013/12/30 Javascript
JS+CSS模拟可以无刷新显示内容的留言板实例
2015/03/03 Javascript
jquery实现树形菜单完整代码
2015/12/29 Javascript
js实现上一页下一页的效果【附代码】
2016/03/10 Javascript
jquery组件WebUploader文件上传用法详解
2020/10/23 Javascript
微信小程序 合法域名校验出错详解及解决办法
2017/03/09 Javascript
jQuery Datatables表头不对齐的解决办法
2017/11/27 jQuery
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
JS实现的简单拖拽购物车功能示例【附源码下载】
2018/01/03 Javascript
React+Webpack快速上手指南(小结)
2018/08/15 Javascript
微信小程序websocket聊天室的实现示例代码
2019/02/12 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
2019/08/23 Javascript
jquery制作的移动端购物车效果完整示例
2020/02/24 jQuery
JS绘图Flot如何实现可选显示曲线图功能
2020/10/16 Javascript
python cs架构实现简单文件传输
2020/03/20 Python
python单向循环链表原理与实现方法示例
2019/12/03 Python
linux环境下安装python虚拟环境及注意事项
2020/01/07 Python
Python中SQLite如何使用
2020/05/27 Python
详解python使用金山词霸的翻译功能(调试工具断点的使用)
2021/01/07 Python
HTML5有哪些新特征
2015/12/01 HTML / CSS
html2canvas截图空白问题的解决
2020/03/24 HTML / CSS
《美丽的小兴安岭》教学反思
2014/02/26 职场文书
2014年国庆节演讲稿
2014/09/02 职场文书
个人师德师风自我剖析材料
2014/09/29 职场文书
2014年城管工作总结
2014/11/20 职场文书
小学毕业感言100字
2015/07/30 职场文书
《抽屉原理》教学反思
2016/02/20 职场文书
《中彩那天》教学反思
2016/02/24 职场文书
班级元旦晚会开幕词
2016/03/04 职场文书
不会写演讲稿,快来看看这篇文章!
2019/08/06 职场文书