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 24 Python
Python保存MongoDB上的文件到本地的方法
Mar 16 Python
简单谈谈python中的多进程
Nov 06 Python
Python实现针对含中文字符串的截取功能示例
Sep 22 Python
python爬取内容存入Excel实例
Feb 20 Python
Python3 实现串口两进程同时读写
Jun 12 Python
python-Web-flask-视图内容和模板知识点西宁街
Aug 23 Python
Python 字符串、列表、元组的截取与切片操作示例
Sep 17 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
Oct 28 Python
python打印文件的前几行或最后几行教程
Feb 13 Python
Python enumerate() 函数如何实现索引功能
Jun 29 Python
python简单验证码识别的实现过程
Jun 20 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 函数中使用static的说明
2012/06/01 PHP
laravel异步监控定时调度器实例详解
2019/06/21 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
JS基础之undefined与null的区别分析
2011/08/08 Javascript
javascript截取字符串小结
2015/04/28 Javascript
Jquery实现顶部弹出框特效
2015/08/08 Javascript
基于javascript实现彩票随机数生成(升级版)
2020/04/17 Javascript
如何用Node写页面爬虫的工具集
2018/10/26 Javascript
qrcode生成二维码微信长按无法识别问题的解决
2019/04/04 Javascript
JavaScript数组去重实现方法小结
2020/01/17 Javascript
JS实现点星星消除小游戏
2020/03/24 Javascript
详解关于Vue单元测试的几个坑
2020/04/26 Javascript
[01:02:32]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第二场 2月26日
2021/03/11 DOTA
Python getopt模块处理命令行选项实例
2014/05/13 Python
Python批量创建迅雷任务及创建多个文件
2016/02/13 Python
Python处理JSON时的值报错及编码报错的两则解决实录
2016/06/26 Python
Python实现字符串格式化输出的方法详解
2017/09/20 Python
浅析python 中大括号中括号小括号的区分
2019/07/29 Python
Python Django框架模板渲染功能示例
2019/11/08 Python
Python PyInstaller库基本使用方法分析
2019/12/12 Python
Keras自定义实现带masking的meanpooling层方式
2020/06/16 Python
Clarins娇韵诗英国官网:来自法国的天然护肤品牌
2017/04/18 全球购物
租房合同协议书
2014/04/09 职场文书
班级年度安全计划书
2014/05/01 职场文书
综艺节目策划方案
2014/06/13 职场文书
建筑工地标语
2014/06/18 职场文书
法定授权委托证明书
2014/09/27 职场文书
2014年后勤工作总结范文
2014/12/16 职场文书
思想品德评语大全
2014/12/31 职场文书
导游词400字
2015/02/13 职场文书
酒店员工手册范本
2015/05/14 职场文书
企业安全生产规章制度
2015/08/06 职场文书
2016年习总书记讲话学习心得体会
2016/01/20 职场文书
如何做好工作总结!
2019/04/10 职场文书
css实现文章分割线样式的多种方法总结
2021/04/21 HTML / CSS
Python破解极验滑动验证码详细步骤
2021/05/21 Python