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 相关文章推荐
Tornado Web服务器多进程启动的2个方法
Aug 04 Python
Python2.x中str与unicode相关问题的解决方法
Mar 30 Python
在Python下使用Txt2Html实现网页过滤代理的教程
Apr 11 Python
学习python 之编写简单乘法运算题
Feb 27 Python
Python面向对象编程之继承与多态详解
Jan 16 Python
python获取酷狗音乐top500的下载地址 MP3格式
Apr 17 Python
flask框架视图函数用法示例
Jul 19 Python
Python求两个圆的交点坐标或三个圆的交点坐标方法
Nov 07 Python
python 读写excel文件操作示例【附源码下载】
Jun 19 Python
Python模拟FTP文件服务器的操作方法
Feb 18 Python
python计算导数并绘图的实例
Feb 29 Python
python3 自动打印出最新版本执行的mysql2redis实例
Apr 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
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
2012/10/24 PHP
关于尾递归的使用详解
2013/05/02 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
2014/03/13 PHP
php递归创建目录的方法
2015/02/02 PHP
php实现遍历多维数组的方法
2015/11/25 PHP
使用JavaScript实现Java的List功能(实例讲解)
2013/11/07 Javascript
jQuery弹簧插件编写基础之“又见弹窗”
2015/12/11 Javascript
bootstrap3 兼容IE8浏览器!
2016/05/02 Javascript
JS判断字符串变量是否含有某个字串的实现方法
2016/06/03 Javascript
本地Bootstrap文件字体图标引入却无法显示问题的解决方法
2020/04/18 Javascript
JavaScript实现星级评分
2017/01/12 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
2018/04/17 jQuery
如何制作一个Node命令行图像识别工具
2018/12/12 Javascript
Node.js使用supervisor进行开发中调试的方法
2019/03/26 Javascript
微信公众平台获取access_token的方法步骤
2019/03/29 Javascript
layui当点击文本框时弹出选择框,显示选择内容的例子
2019/09/02 Javascript
Layer组件多个iframe弹出层打开与关闭及参数传递的方法
2019/09/25 Javascript
js如何验证密码强度
2020/03/18 Javascript
Vue-cli3多页面配置详解
2020/03/22 Javascript
[42:48]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第二场 12.11
2020/12/16 DOTA
详解Django中的form库的使用
2015/07/18 Python
解决sublime+python3无法输出中文的问题
2018/12/12 Python
Python3.5面向对象程序设计之类的继承和多态详解
2019/04/24 Python
利用PyCharm Profile分析异步爬虫效率详解
2019/05/08 Python
浅谈TensorFlow中读取图像数据的三种方式
2020/06/30 Python
Pycharm连接gitlab实现过程图解
2020/09/01 Python
英国时尚女装购物网站:Missguided
2018/08/23 全球购物
SQL Server笔试题
2012/01/10 面试题
理工大学毕业生自荐信
2013/11/01 职场文书
法制宣传标语
2014/06/23 职场文书
政府个人对照检查材料
2014/08/28 职场文书
2014领导干部学习焦裕禄同志先进事迹思想汇报
2014/09/19 职场文书
小学英语复习计划
2015/01/19 职场文书
告诉你创业计划书的8个实用技巧
2019/07/12 职场文书
用Python监控你的朋友都在浏览哪些网站?
2021/05/27 Python
Vue鼠标滚轮滚动切换路由效果的实现方法
2021/08/04 Vue.js