Python 的字典(Dict)是如何存储的


Posted in Python onJuly 05, 2019

前言

Python 的字典有好多个名称("映射"、"哈希"、"散列"或者"关系数组"),那你知道为什么字典会被称为 Hash(翻译为"哈希"或"散列")吗?

你知道为什么字典对于键(Key)的存储数据要求比较严格,但对于对应的值(Value)的存储却要求很宽松吗?

读完这篇文章,你将深刻理解这些问题背后的真相!

hash

首先我们来解释一下什么是 Hash,来自维基百科:

散列函数(或散列算法,又称哈希函数,英语:Hash Function)是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值的指纹。散列值通常用来代表一个短的随机字母和数字组成的字符串。好的散列函数在输入域中很少出现散列冲突。在散列表和数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到。

世界上没有两片完全相同的树叶,也没有两个相同的指纹,散列函数是用于从数据中创建小的数字指纹的方法。

我们看下图示:

Python 的字典(Dict)是如何存储的

如图,Python 调用内部的散列函数,将键(Key)作为参数进行转换,得到一个唯一的地址(这也就解释了为什么给相同的键赋值会直接覆盖的原因,因为相同的键转换后的地址是一样滴),然后将值(Value)存放到该地址中。

对于 Python 来说,键(Key)必须是可哈希的,换句话说就是要可以通过散列函数计算出唯一地址的。那如果拿一个变量当键(Key)可以吗?肯定不行。因为变量随时都可能改变,不符合可哈希原则!

同样的,列表、字典、集合这些都是可变的,所以都不能做为键(Key)来使用。

那有朋友可能会问,那元祖呢?元祖总该是不变的吧?

其实不然,因为元祖里边可以存放列表这类可变因素,所以如果实在想拿元祖当字典的键(Key),那必须对元祖做限制:元组中只包括像数字和字符串这样的不可变元素时,才可以作为字典中有效的键(Key)。

另外还需要注意的一点是,Python 的哈希算法对相同的值计算得到的结果是一样的,也就是说 12315 和 12315.0 的值相同,他们被认为是相同的键(Key)。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
浅谈Python中的闭包
Jul 08 Python
安装Python的教程-Windows
Jul 22 Python
Python3 伪装浏览器的方法示例
Nov 23 Python
Python机器学习logistic回归代码解析
Jan 17 Python
python3+dlib实现人脸识别和情绪分析
Apr 21 Python
selenium+python自动化测试环境搭建步骤
Jun 03 Python
Python 抓取微信公众号账号信息的方法
Jun 14 Python
django 自定义filter 判断if var in list的例子
Aug 20 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
Dec 14 Python
python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析
Feb 20 Python
opencv读取视频并保存图像的方法
Jun 04 Python
详解在OpenCV中如何使用图像像素
Mar 03 Python
关于Python 的简单栅格图像边界提取方法
Jul 05 #Python
Python3+Appium安装使用教程
Jul 05 #Python
Python叠加两幅栅格图像的实现方法
Jul 05 #Python
用vue.js组件模拟v-model指令实例方法
Jul 05 #Python
python买卖股票的最佳时机(基于贪心/蛮力算法)
Jul 05 #Python
Python 计算任意两向量之间的夹角方法
Jul 05 #Python
python实现两个经纬度点之间的距离和方位角的方法
Jul 05 #Python
You might like
php adodb连接mssql解决乱码问题
2009/06/12 PHP
Yii2增删改查之查询 where参数详细介绍
2016/08/08 PHP
JavaScript打印网页指定区域的例子
2014/05/03 Javascript
jQuery中nextUntil()方法用法实例
2015/01/07 Javascript
jQuery检测某个元素是否存在代码分享
2015/07/09 Javascript
AngularJS中实现动画效果的方法
2016/07/28 Javascript
微信小程序开发之实现选项卡(窗口顶部TabBar)页面切换
2016/11/25 Javascript
bootstrap3 dialog 更强大、更灵活的模态框
2017/04/20 Javascript
bootstrap fileinput实现文件上传功能
2017/08/23 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
vue2.0移动端滑动事件vue-touch的实例代码
2018/11/27 Javascript
ES6 十大特性简介
2020/12/09 Javascript
js制作提示框插件
2020/12/24 Javascript
Python中文件操作简明介绍
2015/04/13 Python
在python中画正态分布图像的实例
2019/07/08 Python
Python BeautifulSoup [解决方法] TypeError: list indices must be integers or slices, not str
2019/08/07 Python
mac 上配置Pycharm连接远程服务器并实现使用远程服务器Python解释器的方法
2020/03/19 Python
Python流程控制语句的深入讲解
2020/06/15 Python
Python是怎样处理json模块的
2020/07/16 Python
Selenium python时间控件输入问题解决方案
2020/07/22 Python
CSS书写规范、顺序和命名规则
2014/03/06 HTML / CSS
英国最大的电子零件及配件零售商:Partmaster
2017/04/24 全球购物
Nisbets爱尔兰:英国最大的厨房和餐饮设备供应商
2019/01/26 全球购物
KARATOV珠宝在线商店:俄罗斯珠宝品牌
2019/03/13 全球购物
教师队伍管理制度
2014/01/14 职场文书
世博会口号
2014/06/20 职场文书
辞职信格式范文
2015/05/13 职场文书
2015年城管个人工作总结
2015/05/15 职场文书
英文诗歌翻译方法(赏析)
2019/08/16 职场文书
2019年销售部季度工作计划3篇
2019/10/09 职场文书
导游词之海南-南湾猴岛
2019/10/12 职场文书
Nginx的反向代理实例详解
2021/03/31 Servers
Jupyter notebook 不自动弹出网页的解决方案
2021/05/21 Python
使用 Apache Superset 可视化 ClickHouse 数据的两种方法
2021/07/07 Servers
django 认证类配置实现
2021/11/11 Python
Win11 引入 Windows 365 云操作系统,适应疫情期间混合办公模式:启动时直接登录、模
2022/04/06 数码科技