(Речь идет о реализации CPython)
Встроенная функция hash возвращает целое число – хэш-сумму, которое используется при сравнении ключей словаря во время поиска, например. Для пользовательских классов hash вызывает магический метод класса __hash__ , а для примитивных типов уже есть встроенная реализация на Си.
Примечательно, что для чисел hash обычно возвращает само же значение числа-аргумента, кроме нескольких случаев. Запустим этот код:
def print_hash(x):
print(f'hash({x}) = {hash(x)}')
for i in range(2, -4, -1):
print_hash(i)
Вывод:
hash(2) = 2
hash(1) = 1
hash(0) = 0
hash(-1) = -2 <-- что?
hash(-2) = -2
hash(-3) = -3
Оказывается hash не возвращает -1, а конвертирует его явно в -2. Я изучил исходный код на Си и нашел это место. «Легенда гласит», что в CPython число -1 зарезервировано внутренне для индикации ошибок при выполнении этой функции.
Еще интереснее для рациональных чисел. От hash от NAN – ноль. Плюс еще пасхалка: hash от бесконечности возращает первые несколько цифр числа π.
print_hash(-1.0) # -2
print_hash(float('nan')) # 0
print_hash(float('+inf')) # 314159
print_hash(float('-inf')) # -314159
🧙 Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway 👈