5

キーを見つけるために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 を返すため)。

ハッシュについて私が見たすべてのドキュメントでは、常にhasheqが一緒に言及されており、 cmpneなどは決して言及されていないため、このシナリオで役割を果たすのはこれら2つだけだと思います。

4

1 に答える 1

5

dict キーとして使用するものはすべて、不変式を満たす必要がありbool(x == x) is Trueます。(私はちょうど言ったでしょうがx == x、それがブール値でさえない合理的なオブジェクトがあります。)

dict はこれが成り立つと想定しているため、キーの等価性をチェックするために使用するルーチンは、実際には を使用する前にまずオブジェクト ID をチェックします==。この事前チェックは実装の詳細です。それが起こっているかどうかに頼るべきではありません。

とを(x == x) is not True含む妥当なオブジェクト。float('nan')numpy.array([1, 2])

于 2016-06-29T16:24:51.023 に答える