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

存储数据的过程

例如,我们将‘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位数字作为偏移量。

获取数据的过程

>>> 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 "", line 1, in

bin(hash(b))

TypeError: unhashable type: 'list'

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

3. 键查询速度很快;

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

python 底层原理_Python字典的核心底层原理讲解相关推荐

  1. python dict排序_python 字典(dict)按键和值排序

    python 字典(dict)的特点就是无序的,按照键(key)来提取相应值(value),如果我们需要字典按值排序的话,那可以用下面的方法来进行: 1 下面的是按照value的值从大到小的顺序来排序 ...

  2. python字典实现原理_Python字典底层实现原理详解

    在Python中,字典是通过散列表或说哈希表实现的.字典也被称为关联数组,还称为哈希数组等.也就是说,字典也是一个数组,但数组的索引是键经过哈希函数处理后得到的散列值.哈希函数的目的是使键均匀地分布在 ...

  3. python字典的实现原理_Python字典的实现原理

    以下是自己的学习记录,算是一个总结. 接下来会依次对下面问题做一个解答: 1. Python的dict和set为什么是无序的? 2. 为什么不是所有的python对象都可以用作dict的键和set中的 ...

  4. python系统工作原理_Python之路——堡垒机原理及其简单实现

    1 堡垒机基本概述 其从功能上讲,它综合了核心系统运维和安全审计管控两大主干功能,从技术实现上讲,通过切断终端计算机对网络和服务器资源的直接访问,而采用协议代理的方式,接管了终端计算机对网络和服务器的 ...

  5. python 定时器实现原理_python线程定时器Timer实现原理解析

    这篇文章主要介绍了python线程定时器Timer实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.线程定时器Timer原理 原理比较 ...

  6. python sql拼接_python 字典 拼接SQL语句

    def gen_sql(table_name, data): """ :param table_name: 表名称 :param data: 字典对象 key为字段(要与 ...

  7. python解析原理_Python语法垃圾回收机制原理解析

    一 引入 解释器在执行到定义变量的语法时,会申请内存空间来存放变量的值,而内存的容量是有限的,这就涉及到变量值所占用内存空间的回收问题,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉,那 ...

  8. python 协程原理_Python协程greenlet实现原理

    greenlet是stackless Python中剥离出来的一个项目,可以作为官方CPython的一个扩展来使用,从而支持Python协程.gevent正是基于greenlet实现. 协程实现原理 ...

  9. python set集合_Python字典(dict)和集合(set)

    想必大家都有查字典的经历吧,让我们再回顾一下查字典的步骤:根据拼音或者边旁找到这个字,然后翻到这个字对应的页数,就能看到这个字的详细解释啦. Python字典(dict)其实也是差不多的概念,在字典( ...

最新文章

  1. “香山”处理器产生背后的逻辑
  2. 「POJ 1135」Domino Effect(dfs)
  3. 【学习笔记】opencv的python接口 轮廓特征值 滚动条控制阈值参数
  4. C++——auto_ptr类
  5. Java 操作 HDFS
  6. VMware 安装kali——linux
  7. 题解-bzoj3901 棋盘游戏
  8. (50)Xilinx Multiplier IP核配置(十一)(第10天)
  9. 为什么农村出来的大学生大多混得比较差?
  10. java 3d模型插件_3D模型整合插件 Kitbasher V1.2 支持3DS MAX 2012~2018
  11. 最清楚的01背包问题讲解
  12. ipv6解析地理位置
  13. 家用 NAS 服务器(2)| HyperV的Winserver 2022和Ubuntu 22.04双系统
  14. Python刷题系列(8)_Pandas_Dataframe
  15. grabber.start()获取摄像头数据异常
  16. Flutter实现京东淘宝电商商品详情页效果
  17. matlab spline边界约束,三阶样条插值(一阶导数边界条件) matlab程序
  18. 小明一家过桥,过桥时是黑夜_过桥:如何过渡到软件开发的职业
  19. kali下parallels tools的安装
  20. STM32 AD采样电压计算公式

热门文章

  1. 聊聊“数据安全与数据治理”那些事
  2. 北京协和医学院823计算机原理,2017年北京协和医学院放射医学研究所(天津)823计算机原理考研题库...
  3. 物联网平台存量设备如何一键迁移企业版实例
  4. 钉钉宜搭入选Forrester《中国低代码平台市场分析报告》
  5. Forrester 首席分析师对话阿里云容器服务负责人:容器的未来趋势是什么?
  6. Flink 1.13,面向流批一体的运行时与 DataStream API 优化
  7. DTCC 2020 | 阿里云程实:云原生时代的数据库管理
  8. 2020年中国服装行业数据中台研究报告
  9. C++接口工程实践:有哪些实现方法?
  10. 你的Wi-Fi 还安全吗?全球重大漏洞WPA2 KRACK 详细分析报告