キーを見つけるためにPython辞書が内部で何をしなければならないかを理解しようとしています。ハッシュが最初に評価され、衝突が発生した場合、Python はeqが 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などは決して言及されていないため、このシナリオで役割を果たすのはこれら2つだけだと思います。