字典在存储与读取的时候实际上是通过单元bucket进行工作的。
每个bucket大小固定,因此我们可以通过内存偏移量来获得不同bucket的内容。
对于每一个字典,其bucket的数量是可以变化的,每个bucket有自己的下标,如长度为5的字典有5个bucket,bucket从0~4分别记录着键与值的id。
当我们输入一个键"name"的时候,python会对其进行哈希运算,如
print(bin(hash('name'))
输出
0b1110101110111001101100010011111101001111001011001110110101100
可取右三位(三位最大表示长度8,大于5)0b100=5,即5号下标的bucket,检查是否为空,若空则选择该bucket并进行操作,如果不为空,则依次选取后三位(101,110……)直到为空。
这样,就实现了字典对应键读操作。
那么,如何取得某一键名对应的值呢?
同样地,以name为例,计算其散列值(hash值)后,对应长度为8的字典,我们可以取后三位100,检查其是否有值,如果没有值就返回none(因为按照存储规则,name的数据优先存储在该位置,如果该位置没有其他位置肯定也没有)。
如果不为空,则检查其键对象的散列值是否与目标对象(此时为‘name’)相同,如果相同则取该bucket的值,如果不同则依次取三位直到相同为止,如果一直找不到则也返回none。
这样,也实现了字典对应键值的取操作。