Сравнение списков, содержащих NaN

Я пытаюсь сравнить два разных списка, чтобы убедиться, что они равны, и собирался удалить NaNs, только чтобы обнаружить, что мои сравнения списков все еще работают, несмотря на то, что NaN == NaN -> False .

Может кто-нибудь объяснить, почему следующее оценивает True или False , поскольку я нахожу это поведение неожиданным. Благодаря,

Я прочитал следующее, которое, похоже, не разрешает проблему:

  • Почему в numpy nan == nan есть False, а nan in [nan] – правда?
  • Почему NaN не равен NaN? [дубликат]

(Python 2.7.3, numpy-1.9.2)

Я отметил удивительные оценки с * в конце

 >>> nan = np.nan >>> [1,2,3]==[3] False >>> [1,2,3]==[1,2,3] True >>> [1,2,nan]==[1,2,nan] True *** >>> nan == nan False >>> [nan] == [nan] True *** >>> [nan, nan] == [nan for i in range(2)] True *** >>> [nan, nan] == [float(nan) for i in range(2)] True *** >>> float(nan) is (float(nan) + 1) False >>> float(nan) is float(nan) True *** 

Чтобы понять, что здесь происходит, просто замените nan = np.nan на foo = float('nan') , вы получите точно такой же результат, почему?

 >>> foo = float('nan') >>> foo is foo # This is obviously True! True >>> foo == foo # This is False per the standard (nan != nan). False >>> bar = float('nan') # foo and bar are two different objects. >>> foo is bar False >>> foo is float(foo) # "Tricky", but float(x) is x if type(x) == float. True 

Теперь подумайте, что numpy.nan – это просто имя переменной, которое содержит float('nan') .

Теперь, почему [nan] == [nan] просто потому, что сравнение list сначала проверяет равенство идентичности между элементами до равенства ценности, подумайте об этом как:

 def equals(l1, l2): for u, v in zip(l1, l2): if u is not v and u != v: return False return True