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登录Dr.com思路以及代码分享
Jun 25 Python
Python最火、R极具潜力 2017机器学习调查报告
Dec 11 Python
Python无损音乐搜索引擎实现代码
Feb 02 Python
使用Python的toolz库开始函数式编程的方法
Nov 15 Python
对Python3中dict.keys()转换成list类型的方法详解
Feb 03 Python
Python爬虫实现百度翻译功能过程详解
May 29 Python
对Keras中predict()方法和predict_classes()方法的区别说明
Jun 09 Python
Python实现爬取并分析电商评论
Jun 19 Python
如何使用python记录室友的抖音在线时间
Jun 29 Python
Python必须了解的35个关键词
Jul 16 Python
python四种出行路线规划的实现
Jun 23 Python
Python 文字识别
May 11 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取得字符串首字母的方法
2015/03/25 PHP
PHP创建单例后台进程的方法示例
2017/05/23 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
2011/02/23 Javascript
javascript重写alert方法的实例代码
2013/03/29 Javascript
在js中判断checkboxlist(.net控件客户端id)是否有选中
2013/04/11 Javascript
JS清除IE浏览器缓存的方法
2013/07/26 Javascript
js密码强度检测
2016/01/07 Javascript
AngularJS基础 ng-copy 指令实例代码
2016/08/01 Javascript
纯js实现手风琴效果代码
2020/04/17 Javascript
原生js实现弹出层效果
2017/01/20 Javascript
分分钟学会vue中vuex的应用(入门教程)
2017/09/14 Javascript
JS脚本加载后执行相应回调函数的操作方法
2018/02/28 Javascript
深入了解响应式React Native Echarts组件
2019/05/29 Javascript
JavaScript如何实现图片处理与合成
2020/05/29 Javascript
解决Python中字符串和数字拼接报错的方法
2016/10/23 Python
利用python实现短信和电话提醒功能的例子
2019/08/08 Python
Django使用Celery加redis执行异步任务的实例内容
2020/02/20 Python
Django认证系统user对象实现过程解析
2020/03/02 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
2020/03/08 Python
基于matplotlib xticks用法详解
2020/04/16 Python
Python -m参数原理及使用方法解析
2020/08/21 Python
python 爬虫请求模块requests详解
2020/12/04 Python
CSS3 transforms应用于背景图像的解决方法
2019/04/16 HTML / CSS
Lookfantastic法国官网:英国知名美妆购物网站
2017/10/28 全球购物
速卖通欧盟:Aliexpress EU
2020/08/19 全球购物
C语言变量的命名规则都有哪些
2013/12/27 面试题
自我评价格式
2014/01/06 职场文书
女儿十岁生日答谢词
2014/01/27 职场文书
初中高效课堂实施方案
2014/02/26 职场文书
百年校庆节目主持词
2014/03/27 职场文书
共产党员岗位承诺书
2014/05/29 职场文书
金秋助学感谢信
2015/01/21 职场文书
八年级作文之友谊
2019/12/02 职场文书
阿里云服务器搭建Php+Apache运行环境的详细过程
2021/05/15 PHP
python实现简单的井字棋
2021/05/26 Python