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中json格式数据的编码与解码方法详解
Jul 01 Python
python XlsxWriter模块创建aexcel表格的实例讲解
May 03 Python
Tensorflow卷积神经网络实例
May 24 Python
selenium + python 获取table数据的示例讲解
Oct 13 Python
Python numpy中矩阵的基本用法汇总
Feb 12 Python
详解python 模拟豆瓣登录(豆瓣6.0)
Apr 18 Python
Python Pandas数据结构简单介绍
Jul 03 Python
python误差棒图errorbar()函数实例解析
Feb 11 Python
python 实现分组求和与分组累加求和代码
May 18 Python
基于pandas向csv添加新的行和列
May 25 Python
keras绘制acc和loss曲线图实例
Jun 15 Python
浅析NumPy 切片和索引
Sep 02 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
防止本地用户用fsockopen DDOS攻击对策
2011/11/02 PHP
set_include_path和get_include_path使用及注意事项
2013/02/02 PHP
php自定义的格式化时间示例代码
2013/12/05 PHP
PHP结合Vue实现滚动底部加载效果
2017/12/17 PHP
php实现mysql连接池效果实现代码
2018/01/25 PHP
laravel框架添加数据,显示数据,返回成功值的方法
2019/10/11 PHP
PHP获取真实IP及IP模拟方法解析
2020/11/24 PHP
PHP替换Word中变量并导出PDF图片的实现方法
2020/11/26 PHP
JavaScript高级程序设计 错误处理与调试学习笔记
2011/09/10 Javascript
文本框回车提交与禁止提交示例
2013/09/27 Javascript
JavaScript Ajax Json实现上下级下拉框联动效果实例代码
2013/11/23 Javascript
jquery果冻抖动效果实现方法
2015/01/15 Javascript
jQuery+CSS3实现3D立方体旋转效果
2015/11/10 Javascript
javascript之IE版本检测超简单方法
2016/08/20 Javascript
详解jQuery简单的表单应用
2016/12/16 Javascript
基于jQuery实现选项卡效果
2017/01/04 Javascript
vue基础之事件简写、事件对象、冒泡、默认行为、键盘事件实例分析
2019/03/11 Javascript
详解微信小程序自定义组件的实现及数据交互
2019/07/22 Javascript
element form 校验数组每一项实例代码
2019/10/10 Javascript
[02:17]TI4西雅图DOTA2前线报道 啸天mik夫妻档解说
2014/07/08 DOTA
在MAC上搭建python数据分析开发环境
2016/01/26 Python
Python列表list排列组合操作示例
2018/12/18 Python
python 画函数曲线示例
2019/12/04 Python
Django 限制访问频率的思路详解
2019/12/24 Python
使用opencv识别图像红色区域,并输出红色区域中心点坐标
2020/06/02 Python
python脚本使用阿里云slb对恶意攻击进行封堵的实现
2021/02/04 Python
canvas实现二维码和图片合成的示例代码
2018/08/01 HTML / CSS
银行实习生的自我评价
2013/12/09 职场文书
残疾人创业典型事迹
2014/02/01 职场文书
新闻编辑专业毕业自荐书范文
2014/02/05 职场文书
老总助理工作岗位职责
2014/02/06 职场文书
环保公益广告语
2014/03/13 职场文书
英文推荐信格式范文
2014/05/09 职场文书
大四学生个人总结
2015/02/15 职场文书
2015年先进个人自荐书
2015/03/24 职场文书
职工宿舍管理制度
2015/08/05 职场文书