ich die folgenden Befehle in Python vor kurzem versucht:Warum und wie sind Python-Funktionen hashbar?
>>> {lambda x: 1: 'a'}
{<function __main__.<lambda>>: 'a'}
>>> def p(x): return 1
>>> {p: 'a'}
{<function __main__.p>: 'a'}
Der Erfolg beider dict
Kreationen, die Funktionen hashable beide Lambda und regelmäßig an. (Etwas wie {[]: 'a'}
schlägt mit TypeError: unhashable type: 'list'
fehl).
Der Hash ist offenbar nicht unbedingt die ID der Funktion:
>>> m = lambda x: 1
>>> id(m)
140643045241584
>>> hash(m)
8790190327599
>>> m.__hash__()
8790190327599
Der letzte Befehl zeigt, dass die __hash__
Methode explizit für lambda
s definiert ist, das heißt, dies ist nicht irgendein automagischen Sache berechnet auf Python basiert der Typ.
Was ist die Motivation, Funktionen funktionsfähig zu machen? Für einen Bonus, was ist der Hash einer Funktion?
Ich mag dieses Gefühl, ist die Art von Frage, die Sie sollten nicht berücksichtigen, bevor Sie * Antwort ein * gut haben „Warum würden Sie nicht?“ – Hurkyl
@Hurkyl. Weil es für eine Sache zusätzlichen Wartungsaufwand erfordert. Jemand musste die Funktion "__hash__" entwerfen und schreiben, so dass sie deutlich davon profitieren konnten. Ich würde gerne wissen, was sie dazu gebracht hat, es nicht einfach zu lassen. –
Obwohl die Antworten gegeben werden, scheint es, dass das Deaktivieren der Hash-Funktion mehr Arbeit erfordert, als nur von Objekt zu erben. In der Tat könnte eine der Überlegungen die Verringerung der Unterhaltsschulden gewesen sein. –