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下载歌词并嵌入歌曲文件中的实现代码
Nov 13 Python
Python工程师面试题 与Python Web相关
Jan 14 Python
Python下实现的RSA加密/解密及签名/验证功能示例
Jul 17 Python
Python 离线工作环境搭建的方法步骤
Jul 29 Python
Numpy的简单用法小结
Aug 28 Python
Python 使用type来定义类的实现
Nov 19 Python
python 项目目录结构设置
Feb 14 Python
虚拟机下载python是否需要联网
Jul 27 Python
Python logging日志库空间不足问题解决
Sep 14 Python
python statsmodel的使用
Dec 21 Python
Python的logging模块基本用法
Dec 24 Python
python使用matplotlib的savefig保存时图片保存不完整的问题
Jan 08 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 归并排序 数组交集
2011/05/10 PHP
关于zend studio 出现乱码问题的总结
2013/06/23 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
2014/07/01 PHP
PHP实现根据图片色界在不同位置加水印的方法
2015/08/08 PHP
微信支付PHP SDK ―― 公众号支付代码详解
2016/09/13 PHP
PHP微信红包生成代码分享
2016/10/06 PHP
php curl 模拟登录并获取数据实例详解
2016/12/22 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
Google Map Api和GOOGLE Search Api整合实现代码
2009/07/18 Javascript
WEB页子窗口(showModalDialog和showModelessDialog)使用说明
2009/10/25 Javascript
JavaScript DOM 学习第三章 内容表格
2010/02/19 Javascript
jQuery1.6 使用方法一
2011/11/23 Javascript
JavaScript调用浏览器打印功能实例分析
2015/07/17 Javascript
利用JS生成博文目录及CSS定制博客
2016/02/10 Javascript
JavaScript正则表达式匹配 div  style标签
2016/03/15 Javascript
原生js实现焦点轮播图效果
2017/01/12 Javascript
React Native自定义控件底部抽屉菜单的示例
2018/02/08 Javascript
Python实现FTP上传文件或文件夹实例(递归)
2017/01/16 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
Django添加feeds功能的示例
2018/08/07 Python
在mac下查找python包存放路径site-packages的实现方法
2018/11/06 Python
django连接mysql数据库及建表操作实例详解
2019/12/10 Python
Django 限制访问频率的思路详解
2019/12/24 Python
如何利用python之wxpy模块玩转微信
2020/08/17 Python
导出HTML5 Canvas图片并上传服务器功能
2019/08/16 HTML / CSS
美国婚礼装饰和活动用品批发供应商:Event Decor Direct
2018/10/12 全球购物
Paul Smith英国官网:英国国宝级时装品牌
2019/03/21 全球购物
测绘工程本科生求职信
2013/10/10 职场文书
设计部经理的岗位职责
2013/11/16 职场文书
经贸专业毕业生求职信
2014/03/23 职场文书
关于读书的演讲稿
2014/05/07 职场文书
小学优秀学生评语
2014/12/29 职场文书
检讨书格式范文
2015/05/07 职场文书
领导离职感言
2015/08/03 职场文书
高考满分作文赏析(2篇)
2019/08/12 职场文书
PostgreSQL解析URL的方法
2021/08/02 PostgreSQL