字典核心底层原理
字典对象的核心是一个散列表,散列表是一个系数数组(总是有空白元素的数组)。数组的每个单元叫做bucket,每个bucket包含两个部分:一个是键对对象的引用,一个是指对对对象的引用。
由于所有的bucket大小一样,我们可以通过偏移量来读取指定的bucket。
0 | key1 | value1 |
1 | ||
2 | key2 | value2 |
3 | ||
4 | ||
5 | key4 | value4 |
将一个键值放入字典的底层过程
假设a对象创建完后数组的长度为8
我们要把“name” = "Xujie"这个键值放到字典的对象a中,首先第一步需要计算键“name”的散列值,Python中可以通过hash()来计算
1 >>> bin(hash("name")) 2 '0b100010111111000001110101111010'
由于数组长度为8,我们可以拿计算出的散列值的最右边3位数字作为偏移量,即“010”我们查看偏移量2对应的bucket是否为空,如果为空,则将键值对放入进去,如果不为空,则依次左移三位“111”,再查看偏移量7是否为空,直到找到对应的空位置放下去