Почему и как функции Python могут быть хэшируемыми?
Я недавно попробовал следующие команды в Python:
>>> {lambda x: 1: 'a'}
{<function __main__.<lambda>>: 'a'}
>>> def p(x): return 1
>>> {p: 'a'}
{<function __main__.p>: 'a'}
Успех обоихdict
Creations указывает, что как лямбда-функции, так и обычные функции являются хэшируемыми. (Что-то вроде{[]: 'a'}
не удается сTypeError: unhashable type: 'list'
).
Очевидно, хеш не обязательно является идентификатором функции:
>>> m = lambda x: 1
>>> id(m)
140643045241584
>>> hash(m)
8790190327599
>>> m.__hash__()
8790190327599
Последняя команда показывает, что__hash__
метод явно определен дляlambda
s, то есть, это не какая-то автоматическая вещь, которую Python вычисляет на основе типа.
Какова мотивация сделать функции хэшируемыми? Для бонуса, каков хэш функции?