nan float identity比较False,但元组中的nans比较True

时间:2017-03-11 04:33:31

标签: python reference comparison

有人可以解释下列内容是如何实现的吗?我在Python 2和3中尝试过它,并得到了相同的结果。不应该nan总是比较不相等吗?或者,如果它比较指针,那么指针总是比较相等吗?发生了什么事?

>>> n = float('nan')
>>> n == n
False
>>> (n,) == (n,)
True 

1 个答案:

答案 0 :(得分:2)

对于n == n,它使用float number的比较方法。

对于(n,) == (n,),它调用元组的比较方法

/* Search for the first index where items are different.
 * Note that because tuples are immutable, it's safe to reuse
 * vlen and wlen across the comparison calls.
 */
for (i = 0; i < vlen && i < wlen; i++) {
    int k = PyObject_RichCompareBool(vt->ob_item[i],
                                     wt->ob_item[i], Py_EQ);
    if (k < 0)
        return NULL;
    if (!k)
        break;
}

然后它调用 object 的compare方法。如果两个对象相同,则立即返回true。

/* Quick result when objects are the same.
   Guarantees that identity implies equality. */
if (v == w) {
    if (op == Py_EQ)
        return 1;
    else if (op == Py_NE)
        return 0;
}