Unveränderlich bedeutet, dass sich das Objekt während seiner Lebensdauer nicht wesentlich verändert. Es ist eine vage, aber verbreitete Idee in Programmiersprachen.
Die Hashability unterscheidet sich geringfügig und bezieht sich auf den Vergleich.
Hashable Ein Objekt ist Hashbar, wenn es einen Hashwert hat, der sich während seiner Lebensdauer nie ändert (es benötigt eine__hash__()
Methode) und mit anderen Objekten verglichen werden kann (es benötigt eine__eq__()
oder__cmp__()
Methode). Hashbare Objekte, die gleich sind, müssen denselben Hashwert haben.
Alle benutzerdefinierten Klassen verfügen über eine __hash__
Methode, die standardmäßig nur die Objekt-ID zurückgibt. Ein Objekt, das die Kriterien für die Hashfähigkeit erfüllt, ist also nicht unbedingt unveränderlich.
Objekte einer neuen Klasse, die Sie deklarieren, können als Wörterbuchschlüssel verwendet werden, es sei denn, Sie verhindern dies, indem Sie beispielsweise von werfen __hash__
Wir könnten sagen, dass alle unveränderlichen Objekte hashbar sind, denn wenn sich der Hash während der Lebensdauer des Objekts ändert, bedeutet dies, dass das Objekt mutiert ist.
Aber nicht ganz. Stellen Sie sich ein Tupel mit einer Liste vor (veränderbar). Einige sagen, Tupel sei unveränderlich, aber gleichzeitig ist es etwas nicht hashbar (Würfe).
d = dict()
d[ (0,0) ] = 1
d[ (0,[0]) ] = 1
Hashability und Unveränderlichkeit beziehen sich auf Objektinstanz, nicht auf Typ. Beispielsweise kann ein Objekt vom Typ Tupel hashbar sein oder nicht.
HashMap
wird, wenn Sie ein Objekt ändern, das als Schlüssel darin verwendet wird: Es kann weder ein alter noch ein neuer Schlüssel gefunden werden, obwohl er dort angezeigt wird, wenn Sie die Karte drucken.