为什么在numpy中,“ nan == nan”是False而[nan]中的nan是True?


问题内容

虽然问题的第一部分(标题中)已经被回答了好几次(即,为什么NaN不等于NaN?),但我不明白第二部分为什么如此工作(受到启发)通过这个问题如何检查包含NaN的列表

即:

>> nan == nan
False

>> nan in [nan]
True

考虑到@DSM的答案的问题解释性附录。那么,为什么float("nan")行为不同于nan?它不应该再简单地求值nan吗,解释器为什么要这样表现呢?

>> x = float("nan")
>> y = nan
>> x
nan
>> y
nan
>> x is nan, x is float("nan"), y is nan
(False, False, True)

基本上,nan在第一种情况下它引用相同的泛型,但在第二种情况下创建单独的对象:

>> nans = [nan for i in range(2)]
>> map(id, nans)
[190459300, 190459300]
>> nans = [float("nan") for i in range(2)]
>> map(id, nans)
[190459300, 190459301]

问题答案:

nan不等于是nan的定义的nan一部分,因此很容易。

至于nan in [nan]是真实的,那是因为在相等性之前对身份进行测试以包含在列表中。您正在比较相同的两个对象。

如果您对两个 不同的 nans尝试相同的操作,则会得到False:

>>> nans = [float("nan") for i in range(2)]
>>> map(id, nans)
[190459300, 190459284]
>>> nans
[nan, nan]
>>> nans[0] is nans[1]
False
>>> nans[0] in nans
True
>>> nans[0] in nans[1:]
False

您的附录实际上与无关 nan,这只是Python的工作方式。一旦您了解了float("nan")它没有义务返回一些nan
singleton,并且y = x不复制它,x而是将名称绑定到名为y的对象x,那么就什么也没有了。