注:本文采用 Python 3.12,如有过时内容,请${}^{\text{在}}{}_{\text{评论区}}{}^{\text{提醒我}}{}_{\text{哟}}$
>>> hash(float('inf'))
314159
CPython 你是故意的还是不小心的?
故意不小心的
打开 CPython Python/pyhash.c,_Py_HashDouble
函数是 hash
float
对象的。其中第 93 行到第 98 行是判断(正负)无穷大、$NaN$ 的。
if (!Py_IS_FINITE(v)) {
if (Py_IS_INFINITY(v))
return v > 0 ? _PyHASH_INF : -_PyHASH_INF;
else
return PyObject_GenericHash(inst);
}
如果 v
(就是传进来的值对应的 C double
值)不是有限的,那么:
- 如果
v
是(正负)无穷大,那么:- 如果
v
是正的(无穷大),那么返回_PyHASH_INF
; - 否则返回
-_PyHASH_INF
;
- 如果
- 否则调用
PyObject_GenericHash(inst)
作为返回值。
那么,_PyHASH_INF
是甚么捏?
在 Include/pyhash.h 中,_PyHASH_INF
是 314159
原来,CPython 是故意的!