虽然问题的第一部分(标题中的部分)之前已经被回答过几次了(即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]
float('nan')
总是会创建一个新的对象。你正在测试的nan
是一个现有的对象,它永远不会与新创建的对象具有相同的 ID。在 Python 中的赋值始终只是引用原始对象;无论b
是什么,a = b; a is b
总是会返回True
。 - Mark Ransom