我有以下代码行:
它会打印出:
也许没有一个很好的理由,为什么nan不是真正的单例。但我还没有理解。在我看来,这种行为相当容易出错。
[编辑2]
(针对@Sven Marnach的反应)
仔细阅读@Sven Marnach的答案使我能够理解。这确实是一种妥协,当设计事物时会遇到这种情况。
冰还是很薄的:
如果a in(b,)返回True,如果id(a)== id(b),则似乎与IEEE-754标准不符,即nan应该不等于nan。
结论将是,虽然a在聚合中,但同时它也不在其中,因为聚合中的东西,即b必须按照IEEE标准被认为与a不相等。
我想从现在开始使用isnan...
我有以下代码行:
import math as mt
...
...
...
if mt.isnan (coord0):
print (111111, coord0, type (coord0), coord0 in (None, mt.nan))
print (222222, mt.nan, type (mt.nan), mt.nan in (None, mt.nan))
它会打印出:
111111 nan <class 'float'> False
222222 nan <class 'float'> True
我感到困惑... 有什么解释吗?
Python 3.6.0,Windows 10
我对Python解释器的质量非常有信心... 而且我知道,每当似乎计算机犯了一个错误时,实际上是我自己弄错了... 那我错在哪里呢?
[编辑]
(回应@COLDSPEED)
确实,ID是不同的:
print (111111, coord0, type (coord0), id (coord0), coord0 in (None, mt.nan))
print (222222, mt.nan, type (mt.nan), id (mt.nan), mt.nan in (None, mt.nan))
输出:
111111 nan <class 'float'> 2149940586968 False
222222 nan <class 'float'> 2151724423496 True
也许没有一个很好的理由,为什么nan不是真正的单例。但我还没有理解。在我看来,这种行为相当容易出错。
[编辑2]
(针对@Sven Marnach的反应)
仔细阅读@Sven Marnach的答案使我能够理解。这确实是一种妥协,当设计事物时会遇到这种情况。
冰还是很薄的:
如果a in(b,)返回True,如果id(a)== id(b),则似乎与IEEE-754标准不符,即nan应该不等于nan。
结论将是,虽然a在聚合中,但同时它也不在其中,因为聚合中的东西,即b必须按照IEEE标准被认为与a不相等。
我想从现在开始使用isnan...
math.nan != math.nan
,但是math.nan in [math.nan]
返回True
。猜测 coldspeed 可能是正确的。 - Jared Smith