Metoden hash () returnerar hashvärdet för ett objekt om det har ett.
Hash-värden är bara heltal som används för att jämföra ordbokstangenter under en ordbokssökning snabbt.
Internt hash()
anropar __hash__()
metoden metod för ett objekt som är inställt som standard för något objekt. Vi tittar på det senare.
Syntaxen för hash()
metoden är:
hash (objekt)
hash () Parametrar
hash()
metoden tar en enda parameter:
- objekt - objektet vars hashvärde ska returneras (heltal, sträng, flyt)
Returvärde från hash ()
hash()
metoden returnerar hashvärdet för ett objekt om det har ett.
Om ett objekt har anpassad __hash__()
metod avkortas returvärdet till storleken på Py_ssize_t
.
Exempel 1: Hur fungerar hash () i Python?
# hash for integer unchanged print('Hash for 181 is:', hash(181)) # hash for decimal print('Hash for 181.23 is:',hash(181.23)) # hash for string print('Hash for Python is:', hash('Python'))
Produktion
Hash för 181 är: 181 Hash för 181,23 är: 530343892119126197 Hash för Python är: 2230730083538390373
Exempel 2: hash () för oföränderligt tupelobjekt?
hash()
metoden fungerar bara för oföränderliga föremål som tuple.
# tuple of vowels vowels = ('a', 'e', 'i', 'o', 'u') print('The hash is:', hash(vowels))
Produktion
Hashet är: -695778075465126279
Hur fungerar hash () för anpassade objekt?
Som anges ovan hash()
kallar __hash__()
metoden internt metoden. Så alla objekt kan åsidosättas __hash__()
för anpassade hash-värden.
Men för korrekt hashimplementering, __hash__()
ska alltid returnera ett heltal. Och både __eq__()
och __hash__()
metoder måste implementeras.
Nedan följer fallen för korrekt __hash__()
åsidosättning.
__eq __ () | __hash__() | Beskrivning |
---|---|---|
Definierad (som standard) | Definierad (som standard) | Om det lämnas som det är, jämför alla objekt ojämnt (utom sig själva) |
(Om muterbar) Definierad | Bör inte definieras | Implementering av hashable-insamling kräver att nyckelns hash-värde är oföränderligt |
Inte definierad | Bör inte definieras | Om __eq__() inte är definierat, __hash__() bör inte definieras. |
Definierad | Inte definierad | Klassinstanser kan inte användas som hashable-samling. __hash __ () implicitet inställd på None . Ökar TypeError undantaget om du försöker hämta hash. |
Definierad | Behåll från föräldern | __hash__ = .__hash__ |
Definierad | Vill inte hash | __hash__ = None . Höjer TypeError-undantaget om du försöker hämta hash. |
Exempel 3: hash () för anpassade objekt genom att åsidosätta __hash __ ()
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('The hash is:') return hash((self.age, self.name)) person = Person(23, 'Adam') print(hash(person))
Produktion
Hashet är: 3785419240612877014
Obs! Du behöver inte implementera __eq__()
metoden för hash eftersom den skapas som standard för alla objekt.