Was genau bedeutet es, wenn man sagt, dass ein Objekt in Python-Code Hashable ?
Antworten
Zu viele Anzeigen?In Python ist jedes unveränderliche Objekt (z. B. eine ganze Zahl, ein Boolescher Wert, eine Zeichenkette oder ein Tupel) hashfähig, d. h. sein Wert ändert sich während seiner Lebensdauer nicht. Dies ermöglicht es Python, einen eindeutigen Hash-Wert zur Identifizierung zu erstellen, der von Wörterbüchern verwendet werden kann, um eindeutige Schlüssel und von Sets, um eindeutige Werte zu verfolgen.
Aus diesem Grund verlangt Python, dass wir unveränderliche Datentypen für die Schlüssel in einem Wörterbuch verwenden.
Lassen Sie mich Ihnen ein Arbeitsbeispiel geben, um die hashable Objekte in Python zu verstehen. Für dieses Beispiel nehme ich 2 Tupel, wobei jeder Wert in einem Tupel einen eindeutigen Hash-Wert hat, der sich während seiner Lebensdauer nie ändert. Auf der Grundlage dieses Hash-Werts wird der Vergleich zwischen zwei Tupeln durchgeführt. Wir können den Hash-Wert eines Tupel-Elements mit Id() ermitteln.
Als Ergänzung zu den anderen Antworten: Im Python-Glossar steht: "Objekte, die Instanzen von benutzerdefinierten Klassen sind, sind standardmäßig hashfähig.". Aber es sagt auch: "Hashable Objekte, die gleich verglichen werden, müssen den gleichen Hash-Wert haben".
Wenn Sie also die Funktion __eq__
-Methode ohne Umsetzung der __hash__
-Methode wird Ihr Objekt nicht hashbar sein. Andernfalls ist die Ableitung des Hashes von id()
würde nicht garantieren, dass für zwei Objekte, die gleich sind, der gleiche Hash erzeugt wird ( id(a) != id(b)
sondern a == b
)
>>> class Foo(object):
... def __eq__(self, other): pass
...
>>>
>>> class Bar(object):
... pass
...
>>> f = Foo()
>>> b = Bar()
>>>
>>> hash(f)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'Foo'
>>> hash(b)
8758325844794
Um eine Hash-Tabelle von Grund auf zu erstellen, müssen alle Werte auf "None" gesetzt und bei Bedarf geändert werden. Hashable-Objekte beziehen sich auf die veränderbaren Datentypen (Dictionary, Listen usw.). Sets hingegen können nicht neu initialisiert werden, wenn sie einmal zugewiesen wurden, daher sind Sets nicht hashbar. Die Variante von set() - frozenset() - ist hingegen hashfähig.
- See previous answers
- Weitere Antworten anzeigen