(一)Python入门-3序列:18字典-核心底层原理-内存分析-查找值对象过程

一:根据键查找“键值对”的底层过程

  明白一个键值对是如何存储到数组中的,根据键对象取到值对象,理解起来就 简单了。

    >>> a.get("name")

    ‘jack‘

  当我们调用a.get(“name”),就是根据键“name”查找到“键值对”,从而找到值对象“jack”。

  第一步,我们仍然要计算“name”对象的散列值:

    >>> bin(hash("name"))

    ‘-0b1010111101001110110101100100101‘

  和存储的底层流程算法一致,也是依次取散列值的不同位置的数字。 假设数组长度为 8,我们可以拿计算出的散列值的最右边 3位数字作为偏移量,即“101”,十进制是数字 5。我们查看偏移量 5,对应的bucket 是否为空。如果为空,则返回None。如果不为空, 则将这个bucket的键对象计算对应散列值,和我们的散列值进行比较,如果相等。则将对 应“值对象”返回。如果不相等,则再依次取其他几位数字,重新计算偏移量。依次取完后, 仍然没有找到。则返回 None。流程图如下:

    

二:用法总结

  1. 键必须可散列

    (1) 数字、字符串、元组,都是可散列的。

    (2) 自定义对象需要支持下面三点:

      a 支持 hash()函数

      b 支持通过__eq__()方法检测相等性。

      c 若a==b为真,则 hash(a)==hash(b)也为真。

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

  3. 键查询速度很快

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

原文地址:https://www.cnblogs.com/jack-zh/p/10827661.html

时间: 2024-09-29 11:02:15

(一)Python入门-3序列:18字典-核心底层原理-内存分析-查找值对象过程的相关文章

(一)Python入门-3序列:17字典-核心底层原理-内存分析-存储键值对过程

字典核心底层原理(重要) 字典对象的核心是散列表.散列表是一个稀疏数组(总是有空白元素的数组),数组的 每个单元叫做 bucket.每个 bucket 有两部分:一个是键对象的引用,一个是值对象的引 用. 由于,所有bucket 结构和大小一致,我们可以通过偏移量来读取指定 bucket. 一:将一个键值对放进字典的底层过程 >>> a = {} >>> a["name"]="jack" 假设字典 a对象创建完后,数组长度为 8:

(一)Python入门-3序列:19集合-特点-创建和删除-交集并集差集运算

集合: 集合是无序可变,元素不能重复.实际上,集合底层是字典实现,集合的所有元素都是字典 中的“键对象”,因此是不能重复的且唯一的. 一:集合的创建和删除 1. 使用{}创建集合对象,并使用 add()方法添加元素 1 >>> a = {1,3,5} 2 >>> a 3 {1, 3, 5} 4 >>> a.add(7) 5 >>> a 6 {1, 3, 5, 7} 7 >>> a.add(5) 8 >>&

Python之路,第十八篇:Python入门与基础18

python3  面向对象编程2 类方法: @classmethod 作用:1,类方法是只能访问类变量的方法: 2,类方法需要使用@classmethod 装饰器定义: 3,类方法的第一个参数是类的实例, 约定写成cls 说明:1, 类实例和对象实例都可以调用类方法: 2, 类方法不能方法实例变量 类方法和实例方法对比: 1,类方法能够访问类变量,不能访问实例变量: 实例方法能够访问类变量,也能访问实例变量 2,类方法可以用实例来调用,也可以用类来调用: 实例方法在调用时必须传入实例: 1 cl

【python之路49】使用set底层原理实现对象去重

#一个员工类,创建了300个对象,假设当name gender相同时则认为是同一个人,请给这300个对象去重 #一个员工类,创建了300个对象,假设当name gender相同时则认为是同一个人,请给这300个对象去重 class Employee: def __init__(self, name, age ,gender): self.name = name self.age = age self.gender = gender def __hash__(self): return hash(

Python的序列类型——字典

字典 字典dict,存储的元素是一种无序的键值对(K-V),字典的K值为任意不可变数据类型(如:字符串. 数字.元组),V值为任意数据类型.在计算机内部保存数据的时候是用哈希表表示的,列表不支持转化为 哈希表的原因是K是变化的(列表的可以增.删.改),而元组却可以用哈希表表示.由于它的无序性,使 得它不能像列表那样使用切片.但是我们能对字典的中的K—Y值进行更改.使用for循环时(不能使用while), 默认之只输出K值,不输出V值.当然,在字典中也提供了相应的内置函数弥补这个缺陷. 还有一点需

2018-06-21 中文代码示例视频演示Python入门教程第五章 数据结构

知乎原链 续前作: 中文代码示例视频演示Python入门教程第四章 控制流 对应在线文档: 5. Data Structures 这一章起初还是采取了尽量与原例程相近的汉化方式, 但有些语义较偏(如Trondheim的hammer dance). 鉴于这一教程的目的在于使人尽量快速入门Python, 而任何不熟悉的词汇都会加上不必要的负担. 于是最终决定不拘泥于与原例程的"形似", 而采取在例程中使用更为国人熟知的词汇了. 中文代码示例Python入门教程 5.1 列表详述_哔哩哔哩

(一)Python入门-6面向对象编程:03类对象-类属性-类方法-静态方法

一:类对象 前面讲的类定义格式中,“class 类名:”.实际上,当解释器执行class 语句时, 就会创建一个类对象. [操作] #测试类对象的生成 class Student: pass #空语句 print(type(Student)) print(id(Student)) print(Student) s1 = Student() print(s1) Stu2 = Student s2 = Stu2() print(Stu2) print(s2) 运行结果: <class 'type'>

Python序列之字典 (dict)

字典是Python语言中唯一的映射类型.字典对象是可变的,它是一个容器类型,支持异构.任意嵌套. 创建字典 语法:{key1:val1,key2:val2,.....} dict1 = {} #创建空字典 dict2 = {'n1':'liush','n2':'spirit','n3':'tester'} 字典常用操作及实例展示 可以使用dir(dict)查看字典支持的操作方法 clear 功能:清空字典所有元素 语法:D.clear() -> None.  Remove all items f

走进Python世界(五)数据类型 5. 序列类型-字典(Dictionary)

什么是字典 字典是python中唯一的映射类型(哈希表) 字典是无序的 字典对象是可变的,但是字典的键必须使用不可变的对象,并且一个字典中可以使用不同的类型键值 keys() 或者values()返回键列表或者值列表 items()返回键值对的元组 创建字典 一般方法 常用的方式就是直接使用{} 一般语法如下: dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'} 工厂方法 使用工厂方法dict来创建字典 一般语法如下: fdict=