虽然问题的第一部分(标题中)已经被回答了几次(即,为什么NaN不等于NaN?),我不明白为什么第二部分的工作方式(灵感)通过这个问题如何检查包含NaN的列表?
即:
>> nan == nan
False
>> nan in [nan]
True
Run Code Online (Sandbox Code Playgroud)
考虑@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)
Run Code Online (Sandbox Code Playgroud)
基本上,它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]
Run Code Online (Sandbox Code Playgroud)
DSM*_*DSM 38
nan不等于是nan定义的nan一部分,所以这部分很容易.
至于nan in [nan]是真的,那是因为在列表中包含遏制的相等性之前测试了身份.你正在比较相同的两个对象.
如果您尝试使用两个不同的 nan s 进行同样的操作,那么您将获得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
Run Code Online (Sandbox Code Playgroud)
你的附录并没有多大关系 nan,这就是Python的工作方式.一旦你明白float("nan")没有义务返回一些南单身,并且y = x没有复制x但是将名称绑定到名为y的对象x,就没有什么可以得到的了.