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中字典(Dictionary)用法实例详解
May 30 Python
利用Python如何实现数据驱动的接口自动化测试
May 11 Python
python简易远程控制单线程版
Jun 20 Python
python实现名片管理系统
Nov 29 Python
Python实现微信小程序支付功能
Jul 25 Python
Python装饰器原理与基本用法分析
Jan 07 Python
tensorflow 保存模型和取出中间权重例子
Jan 24 Python
git查看、创建、删除、本地、远程分支方法详解
Feb 18 Python
超级实用的8个Python列表技巧
Aug 24 Python
Python logging日志库空间不足问题解决
Sep 14 Python
基于Python中Remove函数的用法讨论
Dec 11 Python
Scrapy实现模拟登录的示例代码
Feb 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
php学习之流程控制实现代码
2011/06/09 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
2014/07/01 PHP
Symfony2实现在doctrine中内置数据的方法
2016/02/05 PHP
PHP集成环境XAMPP的安装与配置
2018/11/13 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
Array.slice()与Array.splice()的返回值类型
2006/10/09 Javascript
html+js实现动态显示本地时间
2013/09/21 Javascript
从数组中随机取x条不重复数据的JS代码
2013/12/24 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
2015/01/22 Javascript
js创建对象的方法汇总
2016/01/07 Javascript
form+iframe解决跨域上传文件的方法
2016/11/18 Javascript
详解在 Angular 项目中添加 clean-blog 模板
2017/07/04 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
基于vue循环列表时点击跳转页面的方法
2018/08/31 Javascript
实例分析JS中的相等性判断===、 ==和Object.is()
2019/11/17 Javascript
java遇到微信小程序 "支付验证签名失败" 问题解决
2019/12/22 Javascript
javascript运行机制之执行顺序理解
2020/08/03 Javascript
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
2021/02/24 Javascript
python文件读写操作与linux shell变量命令交互执行的方法
2015/01/14 Python
python单例模式实例分析
2015/04/08 Python
详解Python中open()函数指定文件打开方式的用法
2016/06/04 Python
分享一个可以生成各种进制格式IP的小工具实例代码
2017/07/28 Python
解决Django模板无法使用perms变量问题的方法
2017/09/10 Python
python字符串和常用数据结构知识总结
2019/05/21 Python
Python实现12306火车票抢票系统
2019/07/04 Python
python中bs4.BeautifulSoup的基本用法
2019/07/27 Python
flask的orm框架SQLAlchemy查询实现解析
2019/12/12 Python
CSS3 calc()会计算属性详解
2018/02/27 HTML / CSS
Bibloo奥地利:购买女装、男装、童装、鞋和配件
2018/10/18 全球购物
网络维护管理员的自我评价分享
2013/11/11 职场文书
2015羊年春节慰问信
2015/02/14 职场文书
廉政承诺书2015
2015/04/28 职场文书
拖欠货款起诉状
2015/05/20 职场文书
2015初中政教处工作总结
2015/07/21 职场文书
2016年小学生迎国庆广播稿
2015/12/18 职场文书
《战锤40K:暗潮》跳票至9月 公布新宣传片
2022/04/03 其他游戏