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采用getopt解析命令行输入参数实例
Sep 30 Python
Python+Turtle动态绘制一棵树实例分享
Jan 16 Python
Python获取当前函数名称方法实例分享
Jan 18 Python
python爬虫正则表达式之处理换行符
Jun 08 Python
python实现字符串和字典的转换
Sep 29 Python
python计算两个矩形框重合百分比的实例
Nov 07 Python
python 构造三维全零数组的方法
Nov 12 Python
Python Selenium 之数据驱动测试的实现
Aug 01 Python
Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
Feb 05 Python
python新手学习使用库
Jun 11 Python
基于python制作简易版学生信息管理系统
Apr 20 Python
Python基础之数据类型知识汇总
May 18 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图片加中文水印实现代码分享
2012/10/31 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
2013/04/08 PHP
PHP判断上传文件类型的解决办法
2015/10/20 PHP
javascript弹出窗口实现代码
2015/11/12 Javascript
javascript自定义滚动条实现代码
2020/04/20 Javascript
jquery ezUI 双击行记录弹窗查看明细的实现方法
2016/06/01 Javascript
JS获取一个未知DIV高度的方法
2016/08/09 Javascript
Javascript动画效果(3)
2016/10/11 Javascript
JavaScript实现图片瀑布流和底部刷新
2017/01/02 Javascript
jQuery鼠标移动图片上实现放大效果
2017/06/25 jQuery
基于BootStrap实现简洁注册界面
2017/07/20 Javascript
详解vue 数组和对象渲染问题
2018/09/21 Javascript
使用p5.js临摹动态图片
2019/11/04 Javascript
Vue实现小购物车功能
2020/12/21 Vue.js
python使用wxPython打开并播放wav文件的方法
2015/04/24 Python
Python使用回溯法子集树模板解决迷宫问题示例
2017/09/01 Python
对python numpy.array插入一行或一列的方法详解
2019/01/29 Python
Django对models里的objects的使用详解
2019/08/17 Python
python 动态调用函数实例解析
2019/10/21 Python
详解Pycharm与anaconda安装配置指南
2020/08/25 Python
Python编写单元测试代码实例
2020/09/10 Python
pycharm中leetcode插件使用图文详解
2020/12/07 Python
Python  Asyncio模块实现的生产消费者模型的方法
2021/03/01 Python
原生canvas制作画图小工具的踩坑和爬坑
2020/06/09 HTML / CSS
英国在线药房:Express Chemist
2019/03/28 全球购物
YBF Beauty官网:美丽挚友,美国知名彩妆品牌
2020/11/22 全球购物
生物化工专业个人自荐信
2013/09/26 职场文书
物业门卫岗位职责
2013/12/28 职场文书
公司新员工的演讲稿注意事项
2014/01/01 职场文书
公积金单位接收函
2014/01/11 职场文书
五年级上册复习计划
2015/01/19 职场文书
工作推荐信模板
2015/03/25 职场文书
党内外群众意见范文
2015/06/02 职场文书
老人节主持词
2015/07/04 职场文书
2019年销售部季度工作计划3篇
2019/10/09 职场文书
win11无法登录onedrive错误代码0x8004def7怎么办 ?
2022/04/05 数码科技