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实现读取目录所有文件的文件名并保存到txt文件代码
Nov 22 Python
使用基于Python的Tornado框架的HTTP客户端的教程
Apr 24 Python
Python判断文件和文件夹是否存在的方法
May 21 Python
Python中特殊函数集锦
Jul 27 Python
python删除特定文件的方法
Jul 30 Python
python检查URL是否正常访问的小技巧
Feb 25 Python
python numpy格式化打印的实例
May 14 Python
Python中的取模运算方法
Nov 10 Python
Python整数对象实现原理详解
Jul 01 Python
python通过matplotlib生成复合饼图
Feb 06 Python
Django admin组件的使用
Oct 24 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
Jan 28 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之第六天
2006/10/09 PHP
php cout<<的一点看法
2010/01/24 PHP
PHP文件读写操作之文件写入代码
2011/01/13 PHP
奇怪的PHP引用效率问题分析
2012/03/23 PHP
Zend Framework实现自定义过滤器的方法
2016/12/09 PHP
tp5.1 框架join方法用法实例分析
2020/05/26 PHP
jquery控制listbox中项的移动并排序的实现代码
2010/09/28 Javascript
详解addEventListener的三个参数之useCapture
2015/03/16 Javascript
使用pcs api往免费的百度网盘上传下载文件的方法
2016/03/17 Javascript
谈谈JavaScript中浏览器兼容问题的写法小议
2016/12/17 Javascript
教你快速搭建Node.Js服务器的方法教程
2017/03/30 Javascript
nodejs入门教程一:概念与用法简介
2017/04/24 NodeJs
AngularJS使用拦截器实现的loading功能完整实例
2017/05/17 Javascript
vue component组件使用方法详解
2017/07/14 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
解决vue-cli + webpack 新建项目出错的问题
2018/03/20 Javascript
jQuery实现table表格checkbox全选的方法分析
2018/07/04 jQuery
在Create React App中使用CSS Modules的方法示例
2019/01/15 Javascript
详解可以用在VS Code中的正则表达式小技巧
2019/05/14 Javascript
webpack自动打包和热更新的实现方法
2019/06/24 Javascript
webpack + vue 打包生成公共配置文件(域名) 方便动态修改
2019/08/29 Javascript
新手入门js闭包学习过程解析
2019/10/08 Javascript
微信小程序用户盒子、宫格列表的实现
2020/07/01 Javascript
Python 流程控制实例代码
2009/09/25 Python
python中bisect模块用法实例
2014/09/25 Python
python 字符串转列表 list 出现\ufeff的解决方法
2017/06/22 Python
在java中如何定义一个抽象属性示例详解
2017/08/18 Python
wxPython实现窗口用图片做背景
2018/04/25 Python
python读取csv文件并把文件放入一个list中的实例讲解
2018/04/27 Python
python把ipynb文件转换成pdf文件过程详解
2019/07/09 Python
django settings.py 配置文件及介绍
2019/07/15 Python
ubuntu上安装python的实例方法
2019/09/30 Python
Pytorch to(device)用法
2020/01/08 Python
python实现超级玛丽游戏
2020/03/18 Python
护士辞职信怎么写
2015/02/27 职场文书
五四青年节比赛演讲稿
2015/03/18 职场文书