内容:字典用法总结,字典创建的底层逻辑
一、字典用法总结
1.键必须可散列
(1)数字、字符串、元组,都是可散列的
(2)自定义对象需要支持下三点:
1.支持hash()函数
2.支持通过__eq__()方法检测相等性
3.若a==b为真,则hash(a)==hash(b)也为真。
2.字典在内存中开销很大,典型的空间换时间。
3.键查询速度很快
4.往字典里添加新键可能导致扩容,导致散列表中次序改变,因此不要在遍历字典时进行字典的修改。
二、字典创建的底层逻辑
字典对象的核心是散列表
散列表:稀疏的数组(总是有空白元素),数组的每个单元叫bucket。每个bucket都有俩部分:一个是键对象的引用,另一个是值对象的引用.
由于,所有的bucket的结构大小一致,我们可以通过偏移量读取指定的bucket。
KEY1 | Value1 |
KEY2 | Value2 |
KEY3 | Value3 |
创建一个空的字典a={}
假设字典长度为8即:
若想将“name”:“川川”插进去,会先对键“name”求一个哈希值的二进制:
print(bin(hash('name')))
#结果
0b111001010010100011001011000111110101001101000001101010101010011
为了找到一个特定的偏差值来代表“name”又由于该数组索引只有0-7八个数,所以哈希值从右往左取三位“011”即第3行,插入键和值。若第五行已被占用,则继续依次往左三位取值即“010”,以此类推。
总结:
内容都是跟着老师讲课内容写的,基本没什么自己思考的地方,都是理论,重在理解,不过我觉得问题不是很大,毕竟在python中用的最多的还是列表。