【发布时间】:2013-12-17 16:08:40
【问题描述】:
虽然问题的第一部分(在标题中)之前已经回答过几次(即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]
【问题讨论】:
-
补充说明,
float('nan')总是创建一个新对象。您正在测试的nan是一个预先存在的对象,它永远不会与新创建的对象具有相同的 ID。 Python 中的赋值总是简单地引用原始对象;无论b是什么,a = b; a is b将始终返回True。