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使用append合并两个数组的方法
Apr 28 Python
详解Python中 __get__和__getattr__和__getattribute__的区别
Jun 16 Python
python使用KNN算法手写体识别
Feb 01 Python
使用python画个小猪佩奇的示例代码
Jun 06 Python
分享Python切分字符串的一个不错方法
Dec 14 Python
Django ImageFiled上传照片并显示的方法
Jul 28 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
Oct 11 Python
ipad上运行python的方法步骤
Oct 12 Python
python滑块验证码的破解实现
Nov 10 Python
django框架单表操作之增删改实例分析
Dec 16 Python
如何基于Python制作有道翻译小工具
Dec 16 Python
图解Python中深浅copy(通俗易懂)
Sep 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
array_multisort实现PHP多维数组排序示例讲解
2011/01/04 PHP
Thinkphp和onethink实现微信支付插件
2016/04/13 PHP
利用switch语句进行多选一判断的实例代码
2016/11/14 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
2019/06/03 PHP
actionscript与javascript的区别
2011/05/25 Javascript
jquery中animate动画积累的解决方法
2013/10/05 Javascript
jQuery中获取checkbox选中项等操作及注意事项
2013/11/24 Javascript
javascript实现Table间隔色以及选择高亮(和动态切换数据)的方法
2015/05/14 Javascript
详解Javascript模板引擎mustache.js
2016/01/20 Javascript
jQuery页面加载初始化的3种方法(推荐)
2016/06/02 Javascript
jQuery+ajax实现滚动到页面底部自动加载图文列表效果(类似图片懒加载)
2016/06/07 Javascript
AngularJS 表达式详细讲解及实例代码
2016/07/26 Javascript
基于js里调用函数时,函数名带括号和不带括号的区别
2016/07/28 Javascript
浅谈Javascript中的12种DOM节点类型
2016/08/19 Javascript
文件上传插件SWFUpload的使用指南
2016/11/29 Javascript
vue.js学习之vue-cli定制脚手架详解
2017/07/02 Javascript
Node.js  事件循环详解及实例
2017/08/06 Javascript
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
Vue递归实现树形菜单方法实例
2018/11/06 Javascript
详解如何提升JSON.stringify()的性能
2019/06/12 Javascript
JavaScript中如何调用Java方法
2020/09/16 Javascript
[00:31]DOTA2荣耀之路7:Miracle-空血无敌斩
2018/05/31 DOTA
python字符串,数值计算
2016/10/05 Python
网站渗透常用Python小脚本查询同ip网站
2017/05/08 Python
python将字符串以utf-8格式保存在txt文件中的方法
2018/10/30 Python
Python中flatten( )函数及函数用法详解
2018/11/02 Python
python实现任意位置文件分割的实例
2018/12/14 Python
Python爬虫实现验证码登录代码实例
2019/05/10 Python
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
详解CSS3中常用的样式【基本文本和字体样式】
2020/10/20 HTML / CSS
计算机操作自荐信
2013/12/07 职场文书
银行实习鉴定
2013/12/13 职场文书
十岁生日父母答谢词
2014/01/18 职场文书
齐云山导游词
2015/02/06 职场文书
Python实现智慧校园自动评教全新版
2021/06/18 Python
Mysql数据库按时间点恢复实战记录
2021/06/30 MySQL