English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Die Methode hash() gibt den Hash-Wert eines Objekts zurück (wenn vorhanden).
Hash-Werte sind nur einige Ganzzahlen, die im Prozess der Dictionary-Suche zur Vergleich des Dictionary-Schlüssels verwendet werden.
Intern ruft die hash() Methode die Methode __hash__() des Objekts auf, die standardmäßig für alle Objekte gesetzt ist. Wir schauen uns das später an.
Die Syntax der hash() Methode ist:
hash(object)
hash() Methode nimmt einen Parameter:
Objekt -um den Hash-Wert zurückzugeben (Ganze, Strings, Fließkommazahlen)
Die Methode hash() gibt den Hash-Wert eines Objekts zurück (wenn vorhanden).
Wenn ein Objekt eine benutzerdefinierte __hash__() -Methode hat, wird der Wert aufPy_ssize_tGröße.
181hat einen Hash-Wert:181)) # Dezimal-Hash 181.23hat einen Hash-Wert:181.23)) # String-Hash print('Der Hash-Wert von Python:', hash('Python'))
Wenn Sie das Programm ausführen, wird der Ausgabe:
181hat einen Hash-Wert: 181 181.23hat einen Hash-Wert: 579773580 Der Hash-Wert von Python: 2101984854
Die Methode hash() ist nur für unveränderliche Objekte wietuple.
# Elementartupel vowels = ('a', 'e', 'i', 'o', 'u') print('hash ist:', hash(vowels))
Wenn Sie das Programm ausführen, wird der Ausgabe:
hash ist: -695778075465126279
Wie bereits erwähnt, ruft die Methode hash() intern die Methode __hash__() auf. Daher kann jeder Objekt __hash__() überschreiben, um einen benutzerdefinierten Hash-Wert zu erhalten.
Für eine korrekte Hash-Implementierung sollte __hash__() jedoch immer ein Integer zurückgeben. Und es muss sowohl __eq__() als auch __hash__() implementiert werden.
Hier ist die korrekte Überladung von __hash__().
__eq__() | __hash__() | Beschreibung |
---|---|---|
Definiert (standardmäßig) | Definiert (standardmäßig) | Wenn alles so bleibt, sind alle Objekte ungleich (außer sie selbst) |
(wenn veränderlich) definiert | Sollte nicht definiert werden | Um einen hashbaren Satz zu implementieren, müssen die Hash-Werte der Schlüssel unveränderlich sein |
Nicht definiert | Sollte nicht definiert werden | Wenn __eq__() nicht definiert ist, sollte __hash__() nicht definiert werden. |
Definiert | Nicht definiert | Beispielklasse kann nicht als hashbarer Sammlung verwendet werden. __hash__() wird implizit aufNone Wenn Sie versuchen, einen Hash-Wert abzurufen, wird eine TypeError-Ausnahme ausgelöst. |
Definiert | Von der Elternklasse beibehalten | __hash__ = <ParentClass>.__hash__ |
Definiert | Nicht hashbar | __hash__ = None Wenn Sie versuchen, einen Hash-Wert abzurufen, wird eine TypeError-Ausnahme ausgelöst. |
class Person: def __init__(self, age, name): self.age = age self.name = name def __eq__(self, other): return self.age == other.age and self.name == other.name def __hash__(self): print('hash ist:') return hash((self.age, self.name)) person = Person(23, 'Adam') print(hash(person))
Wenn Sie das Programm ausführen, wird der Ausgabe:
hash ist: 3785419240612877014
Hinweis:Sie müssen nicht die __eq__()-Methode für Hash-Werte implementieren, da dies standardmäßig für alle Objekte erstellt wird.