Python字典的核心底层原理讲解

作者:Devin01213 时间:2022-03-26 08:31:09 

字典对象的核心是散列表。散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫做 bucket。每个 bucket 有两部分:一个是键对象的引用,一个是值对象的引用。所有 bucket 结构和大小一致,我们可以通过偏移量来读取指定 bucket。下面通过存储与获取数据的过程介绍字典的底层原理。

Python字典的核心底层原理讲解

存储数据的过程

例如,我们将‘name' = ‘张三' 这个键值对存储到字典map中,假设数组长度为8,可以用3位二进制表示。


>>> map = {}
>>> map
{}
>>> map['name'] = '张三'

1、计算name的散列值。


>>> bin(hash('name'))
'0b101011100000110111101000101010100010011010110010100101001000110'

2、用散列值的最右边 3 位数字作为偏移量,即“110”,十进制是数字 6。我们查看偏移量 6,对应的 bucket 是否为空。如果为空,则将键值对放进去。如果不为空,则依次取右移 3 位作为偏移量,即“000”,十进制是数字0,循环此过程,直到找到为空的 bucket 将键值对放进去。python 会根据散列表的拥挤程度扩容。“扩容”指的是:创造更大的数组,将原有内容拷贝到新数组中。接近 2/3 时,数组就会扩容。扩容后,偏移量的数字个数增加,如数组长度扩容到16时,可以用最右边4位数字作为偏移量。

Python字典的核心底层原理讲解

获取数据的过程


>>> map.get('name')
'张三'

1、计算name的散列值

2、用最右边 3 位数字作为偏移量,即“110”,十进制是数字6。查看偏移量 6,对应的 bucket 是否为空。如果为空,则返回 None。如果不为空,则将这个 bucket 的键对象计算对应散列值,和我们的散列值进行比较,如果相等,则将对应“值对象”返回;如果不相等,则再依次取其他几位数字,重新计算偏移量。循环此过程。

小结:

1.键必须可散列,如数字、元组、字符串;自定义对象需要满足支持hash、支持通过__eq__()方法检测相等性、若 a==b 为真,则 hash(a)==hash(b)也为真。


>>> b = [1,2] //List不可散列
>>> bin(hash(b))
Traceback (most recent call last):
File "<pyshell#90>", line 1, in <module>
 bin(hash(b))
TypeError: unhashable type: 'list'

2. 字典在内存中开销巨大,典型的空间换时间;

3. 键查询速度很快;

4. 往字典里面添加新建可能导致扩容,导致散列表中键的次序变化。因此,不要在遍历字典的同时进行字典的修改。

来源:https://blog.csdn.net/ym01213/article/details/86616749

标签:python,字典,底层原理
0
投稿

猜你喜欢

  • python数据操作之lambda表达式详情

    2022-08-19 21:21:32
  • 深入浅析Python中join 和 split详解(推荐)

    2022-09-19 17:43:38
  • 通俗的讲解深度学习中CUDA,cudatookit,cudnn和pytorch的关系

    2023-05-02 05:07:34
  • 使用 WinHttpRequest 伪造 Referer (附实战代码)

    2010-08-24 18:28:00
  • 不同浏览器空格的宽度

    2007-08-22 08:29:00
  • Linux下安装Python3和django并配置mysql作为django默认服务器方法

    2023-11-15 01:04:44
  • javascript中的关于类型转换的性能优化

    2023-06-26 16:25:48
  • Windows系统下实现pycharm运行.sh文件(本地运行和打开服务器终端)

    2021-03-04 23:53:45
  • asp.net中不能在DropDownList中选择多个项 原因分析及解决方法

    2023-07-23 22:15:27
  • 常用python爬虫库介绍与简要说明

    2023-01-07 13:09:12
  • python的pytest框架之命令行参数详解(下)

    2021-04-19 17:23:48
  • django中瀑布流写法实例代码

    2022-08-04 11:11:26
  • Python 实现网页自动截图的示例讲解

    2023-10-23 09:48:48
  • 模拟兼容性的 inline-block 属性

    2008-04-08 12:37:00
  • 不要忽略了颜色的可用性

    2009-03-05 18:19:00
  • 详细介绍pandas的DataFrame的append方法使用

    2022-08-25 07:00:34
  • Python分析彩票记录并预测中奖号码过程详解

    2023-07-20 04:49:18
  • ASP正则获取图片地址

    2009-09-03 13:18:00
  • 每个ASP程序员必备的知识

    2008-09-21 21:34:00
  • 保护MySQL数据库中重要数据的注意事项

    2009-01-19 11:55:00
  • asp之家 网络编程 m.aspxhome.com