Niezmienność oznacza, że obiekt nie zmieni się w żaden znaczący sposób podczas swojego życia. To niejasny, ale powszechny pomysł w językach programowania.
Hashability jest nieco inna i odnosi się do porównania.
hashable Obiekt jest hashable, jeśli ma wartość hash, która nigdy nie zmienia się w trakcie swojego życia (potrzebuje__hash__()
metody) i można go porównać z innymi obiektami (potrzebujemetody__eq__()
lub__cmp__()
). Obiekty z możliwością mieszania, które porównują równe wartości, muszą mieć tę samą wartość skrótu.
Wszystkie klasy zdefiniowane przez użytkownika mają __hash__
metodę, która domyślnie zwraca tylko identyfikator obiektu. Zatem obiekt, który spełnia kryteria hashability, niekoniecznie jest niezmienny.
Obiekty dowolnej nowej klasy, które zadeklarujesz, mogą być używane jako klucz słownika, chyba że uniemożliwiasz to, na przykład, rzucając z __hash__
Moglibyśmy powiedzieć, że wszystkie niezmienne obiekty są hashowalne, ponieważ jeśli hash zmienia się w trakcie życia obiektu, oznacza to, że obiekt został zmutowany.
Ale nie całkiem. Rozważmy krotkę, która ma listę (zmienną). Niektórzy twierdzą, że krotka jest niezmienna, ale jednocześnie w pewnym sensie nie można jej haszować (rzuca).
d = dict()
d[ (0,0) ] = 1
d[ (0,[0]) ] = 1
Hashability i niezmienność odnoszą się do instancji obiektu, a nie typu. Na przykład obiekt typu krotka może być hashowany lub nie.
HashMap
zmienia się obiekt używany jako klucz: nie można znaleźć ani starego, ani nowego klucza, nawet jeśli drukujesz mapę, można to tam zobaczyć.