【发布时间】:2017-01-03 03:01:37
【问题描述】:
我试图比较两个不同的列表以查看它们是否相等,并打算删除 NaN,结果发现我的列表比较仍然有效,尽管 NaN == NaN -> False。
有人可以解释为什么以下评估True 或False,因为我发现这种行为出乎意料。谢谢,
我已阅读以下内容,但似乎无法解决问题:
- Why in numpy
nan == nanis False while nan in [nan] is True? - Why is NaN not equal to NaN? [duplicate]
(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 is nan是True,因为nan和nan是同一个对象。 -
@Holt 但是在这种情况下如何定义身份,因为没有像
alist = [nan]这样的声明?这会以某种方式发生在内存中吗? -
@Holt,在这种情况下,我发现以下内容令人惊讶,因为我认为
float会创建一个新实例,例如我预计,float(nan) == float(nan)是False,但它是True,而float(nan) is (float(nan) + 1) --> False。 -
@oliversm
nan是内存中的一个对象,因此无论何时使用它,它总是引用同一个对象。当您执行float(nan)时,什么都不会发生,因为nan已经是float,而当您执行float('nan')或float(nan) + 1时,会创建一个新对象,因此身份相等不再成立。 -
@oliversm 将
nan = np.nan替换为nan = float('nan')- 您现在有一个名称为nan的对象,它是float('nan'),根据标准,float('nan') == float('nan')是False,但是nan is nan显然是True,因为nan和nan是同一个对象!
标签: python list comparison nan