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 django集成cas验证系统
Jul 14 Python
使用Python编写简单的画图板程序的示例教程
Dec 08 Python
Python中元组,列表,字典的区别
May 21 Python
启动targetcli时遇到错误解决办法
Oct 26 Python
Python在for循环中更改list值的方法【推荐】
Aug 17 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
Nov 06 Python
Python序列化与反序列化pickle用法实例
Nov 11 Python
Python爬虫获取豆瓣电影并写入excel
Jul 31 Python
python七种方法判断字符串是否包含子串
Aug 18 Python
Python ellipsis 的用法详解
Nov 20 Python
详解MindSpore自定义模型损失函数
Jun 30 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
收音机鉴频器对声音的影响和频偏分析
2021/03/02 无线电
PHP 柱状图实现代码
2009/12/04 PHP
Smarty Foreach 使用说明
2010/03/23 PHP
PHP输出XML到页面的3种方法详解
2013/06/06 PHP
php中json_encode UTF-8中文乱码的更好解决方法
2014/09/28 PHP
php5.4以下版本json不支持不转义内容中文的解决方法
2015/01/13 PHP
php中的抽象方法和抽象类
2017/02/14 PHP
php实现评论回复删除功能
2017/05/23 PHP
jQuery实现等比例缩放大图片让大图片自适应页面布局
2013/10/16 Javascript
代码触发js事件(click、change)示例应用
2013/12/13 Javascript
解决Jquery鼠标经过不停滑动的问题
2014/03/03 Javascript
jquery实现弹出层效果实例
2015/05/19 Javascript
JavaScript严格模式详解
2015/11/18 Javascript
基于JavaScript实现简单的随机抽奖小程序
2016/01/05 Javascript
完美实现js选项卡切换效果(一)
2017/03/08 Javascript
微信小程序使用radio显示单选项功能【附源码下载】
2017/12/11 Javascript
vue-cli脚手架config目录下index.js配置文件的方法
2018/03/13 Javascript
Vue实现todolist删除功能
2018/06/26 Javascript
5分钟快速看懂ES6中的反射与代理
2019/12/19 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
vue 使用rules对表单字段进行校验的步骤
2020/12/25 Vue.js
[04:28]DOTA2亚洲邀请赛小组赛第五日 TOP10精彩集锦
2015/02/03 DOTA
python cookielib 登录人人网的实现代码
2012/12/19 Python
Python实现的数据结构与算法之基本搜索详解
2015/04/22 Python
python 出现SyntaxError: non-keyword arg after keyword arg错误解决办法
2017/02/14 Python
matplotlib绘图实例演示标记路径
2018/01/23 Python
python删除字符串中指定字符的方法
2018/08/13 Python
Python实现的爬取豆瓣电影信息功能案例
2019/09/15 Python
在python里使用await关键字来等另外一个协程的实例
2020/05/04 Python
Python实现Appium端口检测与释放的实现
2020/12/31 Python
CSS3实战第一波 让我们尽情的圆角吧
2010/08/27 HTML / CSS
Charles & Colvard官网:美国莫桑石品牌
2019/06/05 全球购物
初中生自我评价
2014/02/01 职场文书
2015年销售员工作总结范文
2015/04/07 职场文书
花木兰观后感
2015/06/10 职场文书
七年级话题作文之执着
2019/11/19 职场文书