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

字典核心底层原理(重要)

  字典对象的核心是散列表。散列表是一个稀疏数组(总是有空白元素的数组),数组的 每个单元叫做 bucket。每个 bucket 有两部分:一个是键对象的引用,一个是值对象的引 用。

  由于,所有bucket 结构和大小一致,我们可以通过偏移量来读取指定 bucket。

    

一:将一个键值对放进字典的底层过程

    >>> a = {}

    >>>

    a["name"]="jack"

  假设字典 a对象创建完后,数组长度为 8:

    

  我们要把”name”=”jack”这个键值对放到字典对象 a 中,首先第一步需要计算 键”name”的散列值。Python 中可以通过hash()来计算。

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

  ‘-0b1010111101001110110101100100101‘

  由于数组长度为 8,我们可以拿计算出的散列值的最右边 3 位数字作为偏移量,即 “101”,十进制是数字 5。我们查看偏移量 5,对应的 bucket 是否为空。如果为空,则 将键值对放进去。如果不为空,则依次取右边 3位作为偏移量,即“100”,十进制是数字4。再查看偏移量为 4 的 bucket 是否为空。直到找到为空的 bucket 将键值对放进去。流 程图如下:

    

二:扩容

  python会根据散列表的拥挤程度扩容。“扩容”指的是:创造更大的数组,将原有内容 拷贝到新数组中。

  容量接近 2/3 时,数组就会扩容。

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

时间: 2024-11-10 01:21:41

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

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

一:根据键查找“键值对”的底层过程 明白一个键值对是如何存储到数组中的,根据键对象取到值对象,理解起来就 简单了. >>> a.get("name") 'jack' 当我们调用a.get(“name”),就是根据键“name”查找到“键值对”,从而找到值对象“jack”. 第一步,我们仍然要计算“name”对象的散列值: >>> bin(hash("name")) '-0b10101111010011101101011001001

用字典给Model赋值并支持map键值替换

这个是昨天教程的升级版本,支持键值的map替换. 源码如下: NSObject+Properties.h 与 NSObject+Properties.m // // NSObject+Properties.h // // Created by YouXianMing on 14-9-4. // Copyright (c) 2014年 YouXianMing. All rights reserved. // #import <Foundation/Foundation.h> @interface

(一)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之路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)是包含若干“键:值”元素的无序可变序列 字典中元素的“键”可以是python中任意不可变数据,例如整数.实数.复数.字符串.元组等类型可哈希数据,“键”不允许重复,“值”是可以重复的.字典在内部维护的哈希表使得检索操作非常快. 字典创建与删除 使用“=” >>> aDict = {'server':'db.diveintopython3.org','database':'mysql'}>>> x = dict() # 创建空

[ Python入门教程 ] Python字典数据类型及基本操作

字典是Python中重要的数据类型,字典是由"键-值"对组成的集合,"键-值"对之间用逗号隔开,包含在一对花括号中.字典中的"值"通过"键"来引用. 创建字典 创建字典的格式如下: dictionary = {key1:value1, key2:value2, ...} 创建实例如下: dict = {} #空字典 dict1 = {'Lesson1': 'Python', 'Lesson2': 'Java', 'Lesson

python入门以及接口自动化实践

一.Python入门必备基础语法# 标识符:python中我们自己命名的都是标识符# 项目名 包名 模块名# 变量名 函数名 类名# 1:字母 下划线 数字组成 命名的时候不能以数字开头# 2:见名知意:不同的字母和数字之间用下划线隔开# 3:项目名 包名 模块名 变量名 函数名 都是小写字母,不同的字母之间用下划线隔开# 4:类名 首字母大写驼峰命名 StudentInfo HttpRequest# 5:不能以关键字作为标识符 int str float class def... # 行和缩进

Python第五课(字典)

字典 序列这种数据结构是通过序号来访问调用元素集合中的值.但日常生活中的有些对象,两个对象之间存在某种关联关系.比如说电话号码属于某个人,电话号码和人之间就有属于的关系,想根据人的姓名来查找出电话号码,使用序列就不是特别的方便.这种情况下如果能够使用人的名字来进行查询就方便的多了,字典就是一种通过名字来访问调用值的数据结构.字典是python的一种映射类型.字典中的值没有特殊的顺序. 创建和使用字典 字典由键值对组成,使用大括号括起来.键值对使用"键:值"的格式作为一个整体被包含在大括

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

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