虽然问题的第一部分(在标题中)已经被回答了几次(即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]
答案 0 :(得分:34)
nan
不等于nan
是nan
定义的一部分,因此该部分很容易。
至于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
命名的对象,没有什么可以得到的。