Это потому, что NaN
это просто значение с плавающей запятой.Использование is
не проверяет, имеют ли переменные одинаковое значение, оно проверяет, являются ли они одним и тем же объектом.Если вы создаете два числа с одинаковым значением, это не один и тот же объект, это два объекта с одинаковым значением.Возьмем для примера:
>>> a = float('nan')
>>> b = float('nan')
>>> a is b
False
Таким образом, даже если вы создаете два значения NaN
одинаково, они не являются одним и тем же объектом.Это верно даже для более тривиальных операций.Попробуйте это:
>>> a = 1.
>>> b = 1.
>>> a is b
False
Версия Python по умолчанию повторно использует некоторые значения, так что любой экземпляр этого значения является одним и тем же объектом.Возьмем, к примеру, это (обратите внимание на отсутствие десятичного числа, это целые числа, а не числа с плавающей запятой):
>>> a = 1
>>> b = 1
>>> a is b
True
Но это деталь реализации, на которую вы никогда не должны полагаться, она может измениться в любое время и может варьироваться междуреализации Python.Но даже при этом NaN
не является одним из значений, для которых интерпретатор Python по умолчанию делает это.
Вы можете проверить, являются ли две переменные одним и тем же объектом, вручную, используя функцию id
, которая дает уникальный номер для каждого одновременно существующего объекта (хотя числа можно использовать повторно, если переменная удалена,даже автоматически).
>>> a=1.
>>> b=1.
>>> c=float('nan')
>>> d=float('nan')
>>> e=1
>>> f=1
>>> id(a)
139622774035752
>>> id(b)
139622774035872
>>> id(c)
139622774035824
>>> id(d)
139622774035800
>>> id(e)
139622781650528
>>> id(f)
139622781650528
Что касается того, почему они не равны, то это лишь часть определения NaN, которое используется на современных компьютерах.По определению NaN
никогда не должно быть равным себе.Это часть международного стандарта о том, как работают числа с плавающей запятой, и это поведение встроено в современные процессоры.