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中的赋值、浅拷贝、深拷贝介绍
Mar 09 Python
浅谈python配置与使用OpenCV踩的一些坑
Apr 02 Python
python实现list由于numpy array的转换
Apr 04 Python
PyTorch CNN实战之MNIST手写数字识别示例
May 29 Python
使用APScheduler3.0.1 实现定时任务的方法
Jul 22 Python
Python图像处理之图片文字识别功能(OCR)
Jul 30 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
Aug 13 Python
python数据化运营的重要意义
Nov 25 Python
tensorflow将图片保存为tfrecord和tfrecord的读取方式
Feb 17 Python
Django用户身份验证完成示例代码
Apr 03 Python
python爬虫今日热榜数据到txt文件的源码
Feb 23 Python
Python爬虫之爬取某文库文档数据
Apr 21 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
自动跳转中英文页面
2006/10/09 PHP
浅谈php调用python文件
2019/03/29 PHP
PHP中将一个字符串部分字符用星号*替代隐藏的实现代码
2019/09/08 PHP
对laravel in 查询的使用方法详解
2019/10/09 PHP
PHP如何通过带尾指针的链表实现'队列'
2020/10/22 PHP
Javascript 入门基础学习
2010/03/10 Javascript
Javascript 面向对象 重载
2010/05/13 Javascript
JavaScript与DOM组合动态创建表格实例
2012/12/23 Javascript
原生JavaScript生成GUID的实现示例
2014/09/05 Javascript
javascript实现校验文件上传控件实例
2015/04/20 Javascript
vue.js整合mint-ui里的轮播图实例代码
2017/12/27 Javascript
如何使用 vue + d3 画一棵树
2018/12/03 Javascript
layui表格内容溢出的解决方法
2019/09/06 Javascript
记录微信小程序 height: calc(xx - xx);无效问题
2019/12/30 Javascript
在vue中配置不同的代理同时访问不同的后台操作
2020/09/11 Javascript
python数据结构之链表的实例讲解
2017/07/25 Python
python opencv实现运动检测
2018/07/10 Python
Python递归函数实例讲解
2019/02/27 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
2019/06/14 Python
java关于string最常出现的面试题整理
2021/01/18 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
使用 CSS3 中@media 实现网页自适应的示例代码
2020/03/24 HTML / CSS
HTML5 Canvas 起步(2) - 路径
2009/05/12 HTML / CSS
HTML5 visibilityState属性详细介绍和使用实例
2014/05/03 HTML / CSS
HTML5不支持标签和新增标签详解
2016/06/27 HTML / CSS
百联网上商城:i百联
2017/01/28 全球购物
Craghoppers德国官网:户外和旅行服装
2020/02/14 全球购物
幼儿园教师的考核评语
2014/04/18 职场文书
公民授权委托书
2014/10/15 职场文书
部队2015年终工作总结
2015/04/02 职场文书
2015年高二班主任工作总结
2015/05/25 职场文书
2015年公务员试用期工作总结
2015/05/28 职场文书
升学宴学生致辞
2015/07/27 职场文书
婚礼领导致辞大全
2015/07/28 职场文书
受欢迎的自荐信,就这么写!
2019/04/19 职场文书
Ruby GDBM操作简介及数据存储原理
2022/04/19 Ruby