鱼C论坛

 找回密码
 立即注册
查看: 108406|回复: 587

[扩展阅读] 你知道 Python 的字典(Dict)是如何存储的吗?

    [复制链接]
发表于 2014-3-21 16:54:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Python 的字典有好多个名称("映射"、"哈希"、"散列"或者"关系数组"),那你知道为什么字典会被称为 Hash(翻译为"哈希"或"散列")吗?

你知道为什么字典对于键(Key)的存储数据要求比较严格,但对于对应的值(Value)的存储却要求很宽松吗?

读完这篇文章,你将深刻理解这些问题背后的真相!

首先我们来解释一下什么是 Hash,来自维基百科:

散列函数(或散列算法,又称哈希函数,英语:Hash Function)是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值的指纹。散列值通常用来代表一个短的随机字母和数字组成的字符串。好的散列函数在输入域中很少出现散列冲突。在散列表和数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到。

世界上没有两片完全相同的树叶,也没有两个相同的指纹,散列函数是用于从数据中创建小的数字指纹的方法。

我们看下图示:

图片1.png

如图,Python 调用内部的散列函数,将键(Key)作为参数进行转换,得到一个唯一的地址(这也就解释了为什么给相同的键赋值会直接覆盖的原因,因为相同的键转换后的地址是一样滴),然后将值(Value)存放到该地址中。

对于 Python 来说,键(Key)必须是可哈希的,换句话说就是要可以通过散列函数计算出唯一地址的。那如果拿一个变量当键(Key)可以吗?肯定不行。因为变量随时都可能改变,不符合可哈希原则!

同样的,列表、字典、集合这些都是可变的,所以都不能做为键(Key)来使用。

那有朋友可能会问,那元祖呢?元祖总该是不变的吧?

其实不然,因为元祖里边可以存放列表这类可变因素,所以如果实在想拿元祖当字典的键(Key),那必须对元祖做限制:元组中只包括像数字和字符串这样的不可变元素时,才可以作为字典中有效的键(Key)。

另外还需要注意的一点是,Python 的哈希算法对相同的值计算得到的结果是一样的,也就是说 12315 和 12315.0 的值相同,他们被认为是相同的键(Key)。


嗯,这就是事情的真相,如果这篇文章让你学习到信知识,可以点下边“评分”作为奖励哦^_^

评分

参与人数 554荣誉 +2052 鱼币 +1508 贡献 +1031 收起 理由
狂奔的梦想 + 5
何惧123 + 3 + 1 + 1 感谢楼主无私奉献!
Jzz099987 + 5 + 5 + 3
易改乌江水 + 5 + 5 + 3 学习了!!!
cxxxxc + 5 + 3
905723 + 5 + 5 + 3
简简简简单 + 1
asa616628217 + 5 + 5 + 3 感谢楼主无私奉献!
hhiop + 1
小阳19 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-21 17:15:19 | 显示全部楼层
哈哈哈哈,受教了,,,,,

评分

参与人数 2荣誉 +6 鱼币 +2 贡献 +2 收起 理由
a395276912b + 5 + 1 + 2
584250550 + 1 + 1 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 22 反对 0

使用道具 举报

发表于 2014-3-21 18:35:53 | 显示全部楼层
受教啊 O(∩_∩)O~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2014-3-21 19:52:47 | 显示全部楼层
留名支持 小甲鱼{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 7 反对 1

使用道具 举报

发表于 2014-3-21 22:05:30 | 显示全部楼层
我们还需要更多:lol:
感觉没吃饱
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2014-3-22 00:44:16 | 显示全部楼层
感觉还是有点模糊。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 3 反对 0

使用道具 举报

发表于 2014-3-25 16:16:00 | 显示全部楼层
受教受教                  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-26 11:40:54 | 显示全部楼层
不错不错..
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2014-3-26 13:46:01 | 显示全部楼层
不理解,可能我基础不够:sweat:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-14 10:47:05 | 显示全部楼层
受教,但是还是有点糊涂啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-16 06:26:57 | 显示全部楼层
很好很强大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-16 08:01:26 | 显示全部楼层
感谢楼主无私奉献!学习了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-21 15:01:39 | 显示全部楼层
认真的学习了一下:lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-18 16:02:25 | 显示全部楼层
赞,学到老活到老
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-6-12 18:46:56 | 显示全部楼层
看了几遍还是看不知所云......资质太愚钝!!:dizzy:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-12 10:08:56 | 显示全部楼层
不错不错:big
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-16 10:19:00 | 显示全部楼层
懂了一些,继续学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-22 15:11:38 | 显示全部楼层
哦。。。多看看这些扩展知识有利于消化!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2014-8-5 11:45:00 | 显示全部楼层
懂了 ,支持~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-8 14:11:28 | 显示全部楼层
多看看这些扩展知识有利于消化

评分

参与人数 2荣誉 +10 鱼币 +10 贡献 +6 收起 理由
挪威 + 5 + 5 + 3
yuanyuan4220 + 5 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 5 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 07:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表