为什么在numpy`nan == nan`中是假的,而nan在[nan]中是真的?

时间:2013-12-02 02:43:52

标签: python numpy nan

虽然问题的第一部分(在标题中)已经被回答了几次(即Why is NaN not equal to NaN?),但我不明白为什么第二部分的工作方式(灵感)通过这个问题How to Check list containing 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]

1 个答案:

答案 0 :(得分:34)

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

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

如果您使用两个不同 nan尝试相同的操作,则会得到错误:

>>> 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")没有义务返回一些南单身,并且y = x没有复制x,而是将名称y绑定到由x命名的对象,没有什么可以得到的。

相关问题