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 相关文章推荐
使用go和python递归删除.ds store文件的方法
Jan 22 Python
Python学习小技巧之列表项的排序
May 20 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
May 18 Python
浅析python中的迭代与迭代对象
Oct 08 Python
Python第三方Window模块文件的几种安装方法
Nov 22 Python
python交互界面的退出方法
Feb 16 Python
用Python中的turtle模块画图两只小羊方法
Apr 09 Python
Django中信号signals的简单使用方法
Jul 04 Python
django admin.py 外键,反向查询的实例
Jul 26 Python
Python统计分析模块statistics用法示例
Sep 06 Python
numpy ndarray 按条件筛选数组,关联筛选的例子
Nov 26 Python
Django生成数据库及添加用户报错解决方案
Oct 09 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 和 MYSQL
2006/10/09 PHP
php中理解print EOT分界符和echo EOT的用法区别小结
2010/02/21 PHP
PHP设计模式之简单投诉页面实例
2016/02/24 PHP
YII2框架中behavior行为的理解与使用方法示例
2020/03/13 PHP
textarea的value是html文件源代码,存成html文件的代码
2007/04/20 Javascript
JS模板实现方法
2013/04/03 Javascript
Visual Studio中js调试的方法图解
2014/06/30 Javascript
jQuery on方法传递参数示例
2014/12/09 Javascript
javascript实现禁止复制网页内容
2014/12/16 Javascript
jQuery中get()方法用法实例
2014/12/27 Javascript
JavaScript常用的弹出广告及背投广告实现方法
2015/02/06 Javascript
jQuery实现简单的间隔向上滚动效果
2015/03/09 Javascript
jquery拖动层效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
EasyUI 结合JS导出Excel文件的实现方法
2016/11/10 Javascript
JS实现中国公民身份证号码有效性验证
2017/02/20 Javascript
Bootstrap实现的标签页内容切换显示效果示例
2017/05/25 Javascript
javascript 关于赋值、浅拷贝、深拷贝的个人理解
2019/11/01 Javascript
uni-app使用微信小程序云函数的步骤示例
2020/05/22 Javascript
[46:00]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第一局
2016/03/03 DOTA
python多线程http下载实现示例
2013/12/30 Python
Python实现批量将word转html并将html内容发布至网站的方法
2015/07/14 Python
快速了解Python中的装饰器
2018/01/11 Python
浅析python3中的os.path.dirname(__file__)的使用
2018/08/30 Python
Python简单基础小程序的实例代码
2019/04/28 Python
使用pytorch和torchtext进行文本分类的实例
2020/01/08 Python
Python 线性回归分析以及评价指标详解
2020/04/02 Python
Matlab使用Plot函数实现数据动态显示方法总结
2021/02/25 Python
瑞贝卡·泰勒官方网站:Rebecca Taylor
2016/09/24 全球购物
索引覆盖(Index Covering)查询含义
2012/02/18 面试题
Java面试题:说出如下代码的执行结果
2015/10/30 面试题
高中学生会竞选演讲稿
2014/08/25 职场文书
老公保证书怎么写
2015/02/26 职场文书
2015年党员岗位承诺书
2015/04/27 职场文书
初婚初育证明范本
2015/06/18 职场文书
2016师德师风学习心得体会
2016/01/12 职场文书
Linux中sftp常用命令整理
2022/06/28 Servers