虽然问题的第一部分(标题中)已经被回答了几次(即,为什么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]
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
你的附录并没有多大关系 nan
,这就是Python的工作方式.一旦你明白float("nan")
没有义务返回一些南单身,并且y = x
没有复制x
但是将名称绑定到名为y
的对象x
,就没有什么可以得到的了.
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
你的附录并没有多大关系 nan
,这就是Python的工作方式.一旦你明白float("nan")
没有义务返回一些南单身,并且y = x
没有复制x
但是将名称绑定到名为y
的对象x
,就没有什么可以得到的了.