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字典多条件排序方法实例
Jun 30 Python
python基于queue和threading实现多线程下载实例
Oct 08 Python
给Python IDLE加上自动补全和历史功能
Nov 30 Python
在Python中操作字符串之startswith()方法的使用
May 20 Python
Python制作数据导入导出工具
Jul 31 Python
python生成不重复随机数和对list乱序的解决方法
Apr 09 Python
pip install urllib2不能安装的解决方法
Jun 12 Python
解决pandas read_csv 读取中文列标题文件报错的问题
Jun 15 Python
python 获取一个值在某个区间的指定倍数的值方法
Nov 12 Python
Python3中lambda表达式与函数式编程讲解
Jan 14 Python
使用Python生成200个激活码的实现方法
Nov 22 Python
python隐藏类中属性的3种实现方法
Dec 19 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
一台收音机,让一家人都笑逐颜开!
2020/08/21 无线电
PHP经典的给图片加水印程序
2006/12/06 PHP
PHPMailer安装方法及简单实例
2008/11/25 PHP
PHP 遍历XP文件夹下所有文件
2008/11/27 PHP
php脚本守护进程原理与实现方法详解
2017/07/20 PHP
JavaScript中URL编码函数代码
2011/01/11 Javascript
基于jquery点击自以外任意处,关闭自身的代码
2012/02/10 Javascript
JavaScript中__proto__与prototype的关系深入理解
2012/12/04 Javascript
基于nodejs+express(4.x+)实现文件上传功能
2015/11/23 NodeJs
js去字符串前后空格的实现方法
2016/02/26 Javascript
JS解决position:sticky的兼容性问题的方法
2017/10/17 Javascript
vue-cli项目中使用echarts图表实例
2018/10/22 Javascript
ES6 let和const定义变量与常量的应用实例分析
2019/06/27 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
2020/02/10 Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
2020/02/25 Javascript
实例讲解JavaScript 计时事件
2020/07/04 Javascript
[07:48]DOTA2上海特级锦标赛主赛事首日RECAP
2016/03/04 DOTA
Python导入oracle数据的方法
2015/07/10 Python
Python贪吃蛇游戏编写代码
2020/10/26 Python
urllib和BeautifulSoup爬取维基百科的词条简单实例
2018/01/17 Python
Python Web程序部署到Ubuntu服务器上的方法
2018/02/22 Python
python 用opencv调用训练好的模型进行识别的方法
2018/12/07 Python
Python根据成绩分析系统浅析
2019/02/11 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
2019/05/15 Python
python实现从wind导入数据
2019/12/03 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
python 使用tkinter+you-get实现视频下载器
2020/11/17 Python
可自定义箭头样式的CSS3气泡提示框
2016/03/16 HTML / CSS
日本最大化妆品和美容产品的综合口碑网站:cosme shopping
2019/08/28 全球购物
自我评价怎么写正确呢?
2013/12/02 职场文书
保安队长职务说明书
2014/02/23 职场文书
大学校务公开实施方案
2014/03/31 职场文书
教师考核材料
2014/05/21 职场文书
python中requests库+xpath+lxml简单使用
2021/04/29 Python
一篇文章学会Vue中间件管道
2021/06/20 Vue.js
css中:last-child不生效的解决方法
2022/08/05 HTML / CSS