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日志模块logging简介
Apr 13 Python
python技能之数据导出excel的实例代码
Aug 11 Python
使用实现pandas读取csv文件指定的前几行
Apr 20 Python
Python 批量合并多个txt文件的实例讲解
May 08 Python
Python中循环后使用list.append()数据被覆盖问题的解决
Jul 01 Python
Python线程池模块ThreadPoolExecutor用法分析
Dec 28 Python
在python下读取并展示raw格式的图片实例
Jan 24 Python
利用python实现在微信群刷屏的方法
Feb 21 Python
pycharm双击无响应(打不开问题解决办法)
Jan 10 Python
python如何安装下载后的模块
Jul 03 Python
pytorch __init__、forward与__call__的用法小结
Feb 27 Python
让文件路径提取变得更简单的Python Path库
May 27 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
用文本文件实现的动态实时发布新闻的程序
2006/10/09 PHP
php 的加密函数 md5,crypt,base64_encode 等使用介绍
2012/04/09 PHP
PHP读取CURL模拟登录时生成Cookie文件的方法
2014/11/04 PHP
jquery+thinkphp实现跨域抓取数据的方法
2016/10/15 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
2017/07/10 PHP
javascript 类定义的4种方法
2009/09/12 Javascript
jQuery 一个图片切换的插件
2011/10/09 Javascript
checkbox勾选判断代码分析
2014/06/11 Javascript
JS简单获取及显示当前时间的方法
2016/08/03 Javascript
require.js中的define函数详解
2017/07/10 Javascript
浅谈React + Webpack 构建打包优化
2018/01/23 Javascript
node.js的http.createServer过程深入解析
2019/06/06 Javascript
小程序实现锚点滑动效果
2019/09/23 Javascript
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)
2019/12/04 Javascript
[01:02:48]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Liquid
2018/04/03 DOTA
使用Python的Twisted框架实现一个简单的服务器
2015/04/16 Python
Python3实现的简单工资管理系统示例
2019/03/12 Python
python实现简单日期工具类
2019/04/24 Python
将python运行结果保存至本地文件中的示例讲解
2019/07/11 Python
Python并发concurrent.futures和asyncio实例
2020/05/04 Python
Python面向对象多态实现原理及代码实例
2020/09/16 Python
Paper Cape官网:美国婴儿和儿童服装品牌
2019/11/02 全球购物
澳大利亚床上用品、浴巾和家居用品购物网站:Bambury
2020/04/16 全球购物
澳大利亚著名的纺织品品牌:Canningvale
2020/05/05 全球购物
如何用Java实现列出某个目录下的所有子目录
2015/07/20 面试题
学前教育专业毕业生自荐信
2013/10/03 职场文书
企业管理部经理岗位职责
2013/12/24 职场文书
银行演讲稿范文
2014/01/03 职场文书
家具公司总经理岗位职责
2014/07/08 职场文书
高一学年自我鉴定范文(3篇)
2014/09/26 职场文书
小学感恩节活动总结
2015/03/24 职场文书
军事博物馆观后感
2015/06/05 职场文书
2016年中秋节晚会领导致辞
2015/11/26 职场文书
2016年党校科级干部培训班学习心得体会
2016/01/06 职场文书
在HTML5 localStorage中存储对象的示例代码
2021/04/21 Javascript
JavaScript正则表达式实现注册信息校验功能
2022/05/30 Java/Android