Python 的字典(Dict)是如何存储的

作者:keeeeeenon 时间:2021-01-24 05:51:27 

前言

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

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

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

hash

首先我们来解释一下什么是 Hash,来自 * :

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

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

我们看下图示:

Python 的字典(Dict)是如何存储的

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

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

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

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

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

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

来源:https://www.jianshu.com/p/a00c79dee47a

标签:python,字典,Dict,存储
0
投稿

猜你喜欢

  • Python使用MoviePy轻松搞定视频编辑

    2022-04-17 06:02:51
  • js+html5操作sqlite数据库的方法

    2024-01-23 18:31:05
  • 如何利用Python动态模拟太阳系运转

    2022-01-14 15:01:43
  • Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程

    2024-01-19 06:38:45
  • Flask框架利用Echarts实现绘制图形

    2023-01-08 11:52:42
  • MySQL百万级数据大分页查询优化的实现

    2024-01-13 18:22:44
  • CSS 3入门

    2009-04-19 13:00:00
  • 简述mysql监控组复制

    2024-01-22 03:48:55
  • Python的log日志功能及设置方法

    2022-03-28 22:13:32
  • Python爬虫进阶Scrapy框架精文讲解

    2022-08-21 06:00:16
  • JS点击图片弹出文件选择框并覆盖原图功能的实现代码

    2024-02-26 07:17:33
  • sql字段解析器的实现示例

    2024-01-16 13:36:53
  • Python教程教你如何去除背景

    2023-01-08 17:19:40
  • ansible作为python模块库使用的方法实例

    2022-07-15 08:01:02
  • python深度学习tensorflow入门基础教程示例

    2021-08-25 07:03:08
  • Django实现分页功能

    2023-04-04 11:00:56
  • 浅析location.href跨窗口调用函数

    2024-04-17 09:41:37
  • SQLServer2005 没有日志文件(*.ldf) 只有数据文件(*.mdf) 恢复数据库的方法

    2024-01-24 00:15:37
  • Python中ArcPy栅格裁剪栅格(批量对齐栅格图像范围并统一行数与列数)

    2021-02-19 21:12:48
  • 如何使用python爬取知乎热榜Top50数据

    2021-11-13 05:47:09
  • asp之家 网络编程 m.aspxhome.com