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使用新浪微博api上传图片到微博示例
Jan 10 Python
python完成FizzBuzzWhizz问题(拉勾网面试题)示例
May 05 Python
Python创建文件和追加文件内容实例
Oct 21 Python
Python multiprocessing.Manager介绍和实例(进程间共享数据)
Nov 21 Python
python if not in 多条件判断代码
Sep 21 Python
django模型层(model)进行建表、查询与删除的基础教程
Nov 21 Python
python类的方法属性与方法属性的动态绑定代码详解
Dec 27 Python
Python实现Pig Latin小游戏实例代码
Feb 02 Python
Python telnet登陆功能实现代码
Apr 16 Python
Python参数传递及收集机制原理解析
Jun 05 Python
python解释器安装教程的方法步骤
Jul 02 Python
python 制作网站筛选工具(附源码)
Jan 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实现MySQL更新记录的代码
2008/06/07 PHP
解析php中call_user_func_array的作用
2013/06/07 PHP
PHP文件锁定写入实例解析
2014/07/14 PHP
PHP callback函数使用方法和注意事项
2015/01/23 PHP
PHP学习笔记之php文件操作
2016/06/03 PHP
TP5框架请求响应参数实例分析
2019/10/17 PHP
javascript 一个函数对同一元素的多个事件响应
2009/07/25 Javascript
关于跨站脚本攻击问题
2011/12/22 Javascript
浅析Node.js中的内存泄漏问题
2015/06/23 Javascript
浅析JavaScript 调试方法和技巧
2015/10/22 Javascript
Vue.js组件使用开发实例教程
2016/11/01 Javascript
解决Window10系统下Node安装报错的问题分析
2016/12/13 Javascript
详解require.js配置路径的用法和css的引入
2017/09/06 Javascript
详解 vue.js用法和特性
2017/10/15 Javascript
利用JS测试目标网站的打开响应速度
2017/12/01 Javascript
vue 集成jTopo 处理方法
2019/08/07 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
2020/05/15 Javascript
ant design vue导航菜单与路由配置操作
2020/10/28 Javascript
[01:59][TI9趣味视频] 全明星赛奖励
2019/08/23 DOTA
ssh批量登录并执行命令的python实现代码
2012/05/25 Python
Python爬虫爬验证码实现功能详解
2016/04/14 Python
Python中操作mysql的pymysql模块详解
2016/09/13 Python
django 按时间范围查询数据库实例代码
2018/02/11 Python
Python socket模块ftp传输文件过程解析
2019/11/05 Python
500行python代码实现飞机大战
2020/04/24 Python
python进行参数传递的方法
2020/05/12 Python
python实现简易版学生成绩管理系统
2020/06/22 Python
Python根据指定文件生成XML的方法
2020/06/29 Python
Three Graces London官网:英国奢侈品牌
2021/03/18 全球购物
教学实习自我评价
2014/01/28 职场文书
大学生素质拓展活动方案
2014/02/11 职场文书
舞蹈毕业生的自我评价
2014/03/05 职场文书
电子商务专业毕业生自荐书
2014/06/22 职场文书
班级活动总结格式
2014/08/30 职场文书
工作骂脏话检讨书
2014/10/05 职场文书
2014年教研员工作总结
2014/12/23 职场文书