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 相关文章推荐
linux系统使用python获取内存使用信息脚本分享
Jan 15 Python
黑科技 Python脚本帮你找出微信上删除你好友的人
Jan 07 Python
详解python里使用正则表达式的分组命名方式
Oct 24 Python
TensorFlow实现AutoEncoder自编码器
Mar 09 Python
python MySQLdb使用教程详解
Mar 20 Python
详解Python做一个名片管理系统
Mar 14 Python
详解python 爬取12306验证码
May 10 Python
python实现网站用户名密码自动登录功能
Aug 09 Python
基于python的BP神经网络及异或实现过程解析
Sep 30 Python
Python数据可视化:箱线图多种库画法
Nov 06 Python
使用Python实现画一个中国地图
Nov 23 Python
python通过opencv实现图片裁剪原理解析
Jan 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
php setcookie(name, value, expires, path, domain, secure) 参数详解
2013/06/28 PHP
php中调用其他系统http接口的方法说明
2014/02/28 PHP
ThinkPHP之foreach标签使用概述
2014/06/30 PHP
Linux中为php配置伪静态
2014/12/17 PHP
PHP中使用file_get_contents post数据代码例子
2015/02/13 PHP
让元素在网页中可拖动示例代码
2013/08/13 Javascript
Event altKey,ctrlKey,shiftKey属性解析
2013/12/18 Javascript
JQuery动画animate的stop方法使用详解
2014/05/09 Javascript
Jquery 监视按键,按下回车键触发某方法的实现代码
2014/05/11 Javascript
javascipt:filter过滤介绍及使用
2014/09/10 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
jQuery控制div实现随滚动条滚动效果
2016/06/07 Javascript
Cookies 和 Session的详解及区别
2017/04/21 Javascript
使用jQuery实现购物车结算功能
2017/08/15 jQuery
js实现表格单列按字母排序
2020/08/12 Javascript
[57:31]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第一场 2月1日
2021/03/11 DOTA
使用python实现strcmp函数功能示例
2014/03/25 Python
Python输出带颜色的字符串实例
2017/10/10 Python
网易2016研发工程师编程题 奖学金(python)
2019/06/19 Python
PyCharm2018 安装及破解方法实现步骤
2019/09/09 Python
python使用PIL和matplotlib获取图片像素点并合并解析
2019/09/10 Python
Python使用eval函数执行动态标表达式过程详解
2020/10/17 Python
详解css3 mask遮罩实现一些特效
2018/10/24 HTML / CSS
CSS3 flex布局之快速实现BorderLayout布局
2015/12/03 HTML / CSS
amaze ui 的使用详细教程
2020/08/19 HTML / CSS
印度尼西亚值得信赖的第一家网店:Bhinneka
2018/07/16 全球购物
结对共建工作方案
2014/06/02 职场文书
自主招生学校推荐信
2014/09/26 职场文书
法人单位授权委托书范文
2014/10/06 职场文书
国庆横幅标语
2014/10/08 职场文书
2015年求职自荐信范文
2015/03/04 职场文书
困难补助申请报告
2015/05/19 职场文书
2019银行员工个人工作自我鉴定
2019/06/27 职场文书
laravel添加角色和模糊搜索功能的实现代码
2021/06/22 PHP
Python中22个万用公式的小结
2021/07/21 Python
python 远程执行命令的详细代码
2022/02/15 Python