Раньше я полагал, что оператор 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
?