我正在尝试理解Python字典在内部查找键时必须执行的操作。 我觉得首先会计算哈希值,如果发生冲突,Python会迭代遍历键,直到找到一个使等于返回True的键。 这让我想知道为什么以下代码能够运行(仅用于理解内部操作):
class MyClass(object):
def __eq__(self, other):
return False
def __hash__(self):
return 42
if __name__=='__main__':
o1 = MyClass()
o2 = MyClass()
d = {o1: 'o1', o2: 'o2'}
assert(o1 in d) # 1
assert(d[o1]=='o1') # 2
assert(o2 in d) # 3
assert(d[o2]=='o2') # 4
在情况#2和#4中,字典应该无法找到正确的键(返回'o1'或'o2'其中之一,或根据内部实现抛出错误)。由于eq返回False,它如何能够在两种情况下都找到正确的键呢。
我看过的所有哈希文档都提到了hash和eq,而没有提到cmp,ne等,这使我认为这两个是在该场景中发挥作用的唯一因素。
is
操作符是比较对象身份更安全、有时也更高效的方法。 - user2357112