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