В то время как первая часть вопроса (которая находится в заголовке) ответила несколько раз раньше (т.е. Почему NaN не соответствует NaN?), Я не понимаю, почему вторая часть работает так, как она делает (вдохновленная этим вопросом Как проверить список, содержащий NaN)?
А именно:
>> nan == nan
False
>> nan in [nan]
True
Пояснительное дополнение к вопросу, рассматривающему ответ от @DSM. Итак, почему float("nan")
ведет себя иначе, чем nan
? Разве он не должен снова оцениваться простым nan
и почему интерпретатор ведет себя таким образом?
>> x = float("nan")
>> y = nan
>> x
nan
>> y
nan
>> x is nan, x is float("nan"), y is nan
(False, False, True)
В принципе, он относится к тому же родовому nan
в первом случае, но создает отдельный объект во втором:
>> nans = [nan for i in range(2)]
>> map(id, nans)
[190459300, 190459300]
>> nans = [float("nan") for i in range(2)]
>> map(id, nans)
[190459300, 190459301]