1、字典:是python数据类型之一,字典通过花括号来包含数据项,字典的每个元素由2个部分组成,键:值,字典是根据键来找对应的值。

data = {"name": "Ethon", "age": 12, "address": "Shen zhen"}

2、字典的特点

  • 字典与列表、集合一样,都是属于可变数据类型

  • 字典和列表一样,也能够存储多个数据

  • 键对象具有唯一性,因此只有不可变数据类型(数字,字符串和元组)才能作为键键对象

  • 值对象可以为python的任意数据类型

3、字典的内存分布

data = {"name": "Ethon", "age": 12, "address": "Shen zhen"}
print(data) # {'name': 'Ethon', 'age': 12, 'address': 'Shen zhen'}

Python学习4(字典的内存分布)-LMLPHP

 4、字典底层原理

字典对象的核心是散列表,散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫做 bucket。每个 bucket 有两部分:一个是键对象的引用,一个是值对象的引用。由于所有 bucket 结构和大小一致,我们可以通过偏移量来读取指定 bucket。

Python学习4(字典的内存分布)-LMLPHP

4.1、键值的存储过程

data = {}
data["name"] = "Ethon"
data["age"] = 12
data["address"] = "Shen zhen"
print(bin(hash("name")))
# -0b110101010110011100010010100000011000110000001101000100000111101
print(bin(hash("age")))
# 0b1001111110011010111111111010000010110010101000011000011100
print(bin(hash("address")))
# 0b100011011010010101010010100001110110010101001101100010000110011

1.首先要计算data["name"]的散列值

2.得到hash值后,我们从hash值最右边3位数字作为偏离量,即"101"

3.我们查看偏移量"101" 对应的bucket是否为空,如果为空,则将键值对放进去

4.如果不为空,则依次去右边3位作为偏离量,即111"

5.再看偏离量"111" 对应的bucket是否为空,直到找到为空的bucket将键值对放进去。

 Python学习4(字典的内存分布)-LMLPHP

4.2、字典查找值的过程

1.我们要计算data["name"] 里面的"name"对象

2.确定偏离量,散列值的最右边3位数字作为偏离量 "101"

3.查看偏离量"101"对应的bucket是否为空,如果为空,则返回None

4.如果不为空,则将这个bucket的键对象计算出对应的散列值和data["name"]的"name"散列值进行比较,如果两个散列值相等,则将对应数组里的值对象返回,如果不相等,则再依次取其他几位数字,重新计算偏离量。依次取完,仍然没有找到,则返回None。

Python学习4(字典的内存分布)-LMLPHP

05-08 21:12