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 29 Python
Python语法快速入门指南
Oct 12 Python
python 中split 和 strip的实例详解
Jul 12 Python
Python3单行定义多个变量或赋值方法
Jul 12 Python
Python使用googletrans报错的解决方法
Sep 25 Python
解决python3运行selenium下HTMLTestRunner报错的问题
Dec 27 Python
判断python对象是否可调用的三种方式及其区别详解
Jan 31 Python
python接口自动化(十六)--参数关联接口后传(详解)
Apr 16 Python
Django 导出项目依赖库到 requirements.txt过程解析
Aug 23 Python
Tensorflow中的降维函数tf.reduce_*使用总结
Apr 20 Python
Python爬取科目四考试题库的方法实现
Mar 30 Python
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
Oct 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
多php服务器实现多session并发运行
2006/10/09 PHP
常用的php ADODB使用方法集锦
2008/03/25 PHP
PHP将session信息存储到数据库的类实例
2015/03/04 PHP
ThinkPHP中order()使用方法详解
2016/04/19 PHP
自己动手制作jquery插件之自动添加删除行的实现
2011/10/13 Javascript
js获取视频时长代码
2014/04/10 Javascript
jQuery实现菜单感应鼠标滑动动画效果的方法
2015/02/28 Javascript
javascript中的正则表达式使用指南
2015/03/01 Javascript
JavaScript如何自定义trim方法
2015/07/28 Javascript
Jquery树插件zTree实现菜单树
2017/01/24 Javascript
es7学习教程之fetch解决异步嵌套问题的方法示例
2017/07/21 Javascript
原生JS封装animate运动框架的实例
2017/10/12 Javascript
详解基于Vue+Koa的pm2配置
2017/10/24 Javascript
从零开始搭建一个react项目开发
2018/02/09 Javascript
详解Axios统一错误处理与后置
2018/09/26 Javascript
layui多图上传实现删除功能的例子
2019/09/23 Javascript
NodeJS和浏览器中this关键字的不同之处
2021/03/03 NodeJs
Python RuntimeError: thread.__init__() not called解决方法
2015/04/28 Python
详解Python中的文件操作
2016/08/28 Python
Python单例模式实例详解
2017/03/01 Python
python实现二叉查找树实例代码
2018/02/08 Python
利用Pyhton中的requests包进行网页访问测试的方法
2018/12/26 Python
Python之pymysql的使用小结
2019/07/01 Python
Python IDE Pycharm中的快捷键列表用法
2019/08/08 Python
基于django传递数据到后端的例子
2019/08/16 Python
Django配置文件代码说明
2019/12/04 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
2020/07/02 Python
俄罗斯街头服装品牌:Black Star Wear
2017/03/01 全球购物
波兰办公用品和学校用品在线商店:Dlabiura24.pl
2020/11/18 全球购物
大学生求职信范文应怎么写
2014/01/01 职场文书
企业演讲比赛主持词
2014/03/18 职场文书
入股协议书范本
2014/11/01 职场文书
2014年移动公司工作总结
2014/12/08 职场文书
导游词之江南园林狮子林
2019/09/16 职场文书
React Native项目框架搭建的一些心得体会
2021/05/28 Javascript
上帝为你开了一扇窗之Tkinter常用函数详解
2021/06/02 Python