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 相关文章推荐
wxPython窗口中文乱码解决方法
Oct 11 Python
Python最长公共子串算法实例
Mar 07 Python
python字典排序实例详解
May 20 Python
python之Character string(实例讲解)
Sep 25 Python
python将list转为matrix的方法
Dec 12 Python
PyTorch的深度学习入门教程之构建神经网络
Jun 27 Python
Python 二叉树的层序建立与三种遍历实现详解
Jul 29 Python
python3利用Axes3D库画3D模型图
Mar 25 Python
Python实现多线程下载脚本的示例代码
Apr 03 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
Apr 23 Python
python palywright库基本使用
Jan 21 Python
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
Apr 21 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
解析PHP中的unset究竟会不会释放内存
2013/07/18 PHP
php中OR与|| AND与&amp;&amp;的区别总结
2013/10/26 PHP
php基于mcrypt的加密解密实例
2014/10/27 PHP
PHP数据库操作四:mongodb用法分析
2017/08/16 PHP
JScript的条件编译
2007/05/29 Javascript
Javascript 面向对象 对象(Object)
2010/05/13 Javascript
使用Jquery打造最佳用户体验的登录页面的实现代码
2011/07/08 Javascript
[JSF]使用DataModel处理表行事件的实例代码
2013/08/05 Javascript
javascript实现简单的省市区三级联动
2015/05/14 Javascript
javascript日期计算实例分析
2015/06/29 Javascript
JavaScript实现倒计时代码段Item1(非常实用)
2015/11/03 Javascript
浅谈jQuery操作类数组的工具方法
2016/12/23 Javascript
浅谈jquery拼接字符串效率比较高的方法
2017/02/22 Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
2017/10/27 jQuery
微信小程序自定义toast实现方法详解【附demo源码下载】
2017/11/28 Javascript
微信小程序三级联动选择器使用方法
2020/05/19 Javascript
微信小程序实现pdf、word等格式文件上传的方法
2019/09/10 Javascript
JavaScript代码异常监控实现过程详解
2020/02/17 Javascript
js实现盒子滚动动画效果
2020/08/09 Javascript
vue实现标签云效果的示例
2020/11/09 Javascript
jquery实现加载更多&quot;转圈圈&quot;效果(示例代码)
2020/11/09 jQuery
解决Pycharm界面的子窗口不见了的问题
2019/01/17 Python
python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】
2019/10/24 Python
python selenium 执行完毕关闭chromedriver进程示例
2019/11/15 Python
Python插入Elasticsearch操作方法解析
2020/01/19 Python
使用Python制作新型冠状病毒实时疫情图
2020/01/28 Python
Python如何实现Paramiko的二次封装
2021/01/30 Python
html5 浏览器支持 如何让所有的浏览器都支持HTML5标签样式
2012/12/07 HTML / CSS
世界最大的票务市场:viagogo
2017/02/16 全球购物
Windows和Linux动态库应用异同
2016/07/28 面试题
《听鱼说话》教学反思
2014/02/15 职场文书
检查接待方案
2014/02/27 职场文书
习总书记三严三实学习心得体会
2014/10/13 职场文书
小学教师先进事迹材料
2014/12/15 职场文书
2015年乡镇工作总结范文
2015/04/22 职场文书
详解Golang如何优雅的终止一个服务
2022/03/21 Golang