|
|
1
4
要在dict中查找密钥,首先要通过散列来查找候选项,然后再查看它是fluke(尽管散列相同,但对象不同)还是真正想要的密钥。所以如果你在这个杂凑下找不到任何东西,那就没什么好对付的了。 想象一下你在聚会上找一个熟人,却不知道她在不在。她有一头红头发。通常,你会寻找红发女孩,然后去面对他们,看看是否真的是她。如果派对上还没有红发女郎来,那就没有必要检查每一个人。(假设你的朋友不从事日常染色工作。)
编辑:CPython将dict存储在一个数组中,其中主数组的位置由散列决定;如果该位置被占用,它将以数学上确定的方式跳转到下一个候选位置。由于填充的位置可以因此保存“正确的”散列或不相关的散列,当查找散列时,CPython将从主位置开始,然后继续比较散列,直到它确定不可能存在搜索到的密钥。散列现在是普通的低级整数,而不是Python对象,这解释了为什么散列比较不会触发
注意源代码中的一个可爱的优化:对于每个候选对象,CPython首先检查对象标识;然后才检查散列是否仍然相同,如果仍然相同,则转到慢速检查以查看对象是否相等(使用
|