Раньше я полагал, что оператор in в Python проверяет наличие элемента в некоторой коллекции с помощью проверки равенства ==, поэтому element in some_list примерно эквивалентен any(x == element for x in some_list). Например:
True in [1, 2, 3]
# True because True == 1
или
1 in [1., 2., 3.]
# also True because 1 == 1.
Однако хорошо известно, что NaN не равно самому себе. Поэтому я ожидал, что float("NaN") in [float("NaN")] False. И это действительно False.
Однако, если мы используем numpy.nan вместо float("NaN"), ситуация совсем иная:
import numpy as np
np.nan in [np.nan, 1, 2]
# True
Но np.nan == np.nan все еще дает False!
Как это возможно? Какая разница между np.nan и float("NaN")? Как in имеет дело с np.nan?