366 Stimmen

Was bedeutet "hashable" in Python?

Was genau bedeutet es, wenn man sagt, dass ein Objekt in Python-Code Hashable ?

16voto

Akku2403 Punkte 141

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.

2voto

naghceuz Punkte 45

In Python bedeutet dies, dass das Objekt Mitglied einer Menge sein kann, um einen Index zurückzugeben. Das heißt, sie haben eine eindeutige Identität/ id.

zum Beispiel in python 3.3:

Die Datenstruktur Listen ist nicht hashfähig, aber die Datenstruktur Tupel ist hashfähig.

1voto

bks4line Punkte 487

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.

Comparison between 2 tuplesEquivalence between 2 tuples

1voto

Victor Punkte 81

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

-3voto

JAY Punkte 9

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X