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 安装virtualenv和virtualenvwrapper的方法
Jan 13 Python
Python3实现发送QQ邮件功能(文本)
Dec 15 Python
详解Python Qt的窗体开发的基本操作
Jul 14 Python
django 中QuerySet特性功能详解
Jul 25 Python
python 使用socket传输图片视频等文件的实现方式
Aug 07 Python
Python3多线程版TCP端口扫描器
Aug 31 Python
python 检查数据中是否有缺失值,删除缺失值的方式
Dec 02 Python
Python 之 Json序列化嵌套类方式
Feb 27 Python
python学生管理系统的实现
Apr 05 Python
tensorflow安装成功import tensorflow 出现问题
Apr 16 Python
python爬虫基础知识点整理
Jun 02 Python
Java byte数组操纵方式代码实例解析
Jul 22 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中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
2011/03/29 PHP
简单的php+mysql聊天室实现方法(附源码)
2016/01/05 PHP
PHP实现通过CURL上传文件功能示例
2018/05/30 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
tp5修改(实现即点即改)
2019/10/18 PHP
jQuery UI Autocomplete 1.8.16 中文输入修正代码
2012/04/16 Javascript
JS如何将UTC格式时间转本地格式
2013/09/04 Javascript
网页收藏夹显示ICO图标(代码少)
2015/08/04 Javascript
JavaScript数据结构与算法之栈与队列
2016/01/29 Javascript
简单谈谈ES6的六个小特性
2016/11/18 Javascript
学习vue.js条件渲染
2016/12/03 Javascript
canvas绘制七巧板
2017/02/03 Javascript
JavaScript 中调用 Kotlin 方法实例详解
2017/06/09 Javascript
微信小程序使用navigateTo数据传递的实例
2017/09/26 Javascript
初探Vue3.0 中的一大亮点Proxy的使用
2018/12/06 Javascript
微信小程序使用二次贝塞尔曲线画波浪
2018/12/25 Javascript
vue路由对不同界面进行传参及跳转的总结
2019/04/20 Javascript
微信小程序遍历Echarts图表实现多个饼图
2019/04/25 Javascript
Vue 请求传公共参数的操作
2020/07/31 Javascript
python递归打印某个目录的内容(实例讲解)
2017/08/30 Python
flask入门之表单的实现
2018/07/18 Python
python中协程实现TCP连接的实例分析
2018/10/14 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
Python中字符串与编码示例代码
2019/05/20 Python
python 利用pyttsx3文字转语音过程详解
2019/09/25 Python
python读文件的步骤
2019/10/08 Python
python文件操作的简单方法总结
2019/11/07 Python
python中sympy库求常微分方程的用法
2020/04/28 Python
opencv 形态学变换(开运算,闭运算,梯度运算)
2020/07/07 Python
Pytorch之扩充tensor的操作
2021/03/04 Python
Html5页面二次分享的实现
2018/07/30 HTML / CSS
类如何去实现接口
2013/12/19 面试题
《珍珠泉》教学反思
2014/02/20 职场文书
机械设计及其自动化专业求职信
2014/06/09 职场文书
hive数据仓库新增字段方法
2022/06/25 数据库
box-shadow单边阴影的实现
2023/05/21 HTML / CSS