Python 为什么在numpy中'nan==nan'为假而[nan]中的nan为真?

Python 为什么在numpy中'nan==nan'为假而[nan]中的nan为真?,python,numpy,nan,Python,Numpy,Nan,虽然问题的第一部分(在标题中)已经被回答了好几次(即),但我不明白为什么第二部分的工作方式是这样的(受这个问题的启发) 即: >> nan == nan False >> nan in [nan] True 考虑@DSM答案的问题解释性附录。那么,为什么float(“nan”)的行为不同于nan?它不应该再次评估为simplenan吗?为什么解释器会这样做 >> x = float("nan") >> y = nan >> x n

虽然问题的第一部分(在标题中)已经被回答了好几次(即),但我不明白为什么第二部分的工作方式是这样的(受这个问题的启发)

即:

>> nan == nan
False

>> nan in [nan]
True

考虑@DSM答案的问题解释性附录。那么,为什么
float(“nan”)
的行为不同于
nan
?它不应该再次评估为simple
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]

nan
不等于
nan
nan
定义的一部分,因此这一部分很简单

至于[nan]中的
nan是真的,那是因为在列表中包含的相等性之前先测试身份。您正在比较相同的两个对象

如果您使用两个不同的
nan
s尝试相同的操作,则会得到错误:

>>> 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”)
没有义务返回一些nan单例,并且
y=x
不会复制
x
,而是将名称
y
绑定到
x
命名的对象,就没有什么可以得到的了。

Hmm。。。为什么第一个例子中的nan是相同的?为什么它们不初始化为两个不同的对象?因为[x]
中的
x=nan
nan仍然返回
True
@sashkello:您指的第一个示例是什么?你的
nan==nan
nan
命名一个特定的对象(在本例中,我非常确定它是
np.nan
)。不管你说了多少次这个名字,它仍然指的是同一个对象:没有进行初始化。类似地,
x=nan
不会复制
nan
,它只是将
x
命名为一个新名称,并表示它命名的对象也是由
nan
命名的。例如,在这样做之后尝试
x是nan
。我只是不明白这与float(“nan”)有什么不同?楠有不同的“口味”吗?否则,正如我所理解的,float(“nan”)仍然应该返回nan,这也是同一个对象,不是吗?我想了解为什么[nan]
中的nan与[float(“nan”)中的'nan不同?口译员如何知道列表中的nan是以不同的方式获得的?我也不明白为什么[float(“nan”)中的float(“nan”)在这种情况下是错误的……不,正如我在原始问题中所说,nan不是唯一的对象。看看上面的记录:两个
nan
s有不同的ID,
nans[0]是nans[1]
是False<[nan]中的code>nan是正确的,因为它基本上是
any(x是nan或x==nan表示[nan]中的x])
x为nan
为真,因此
x==nan
为假并不重要。[float(“nan”)]中应用于
nan的相同规则给出了
x是nan
是False(它们是不同的对象),并且
x==nan
仍然是False<[float(“nan”)]
中的code>float(“nan”)给出False,因为它们是两个独立的nan。@sashkello,这并不重要,但确实有不同风格的nan,也有行为相同的信令nan。在您的附录中,
float(“nan”)
总是创建一个新对象。您正在测试的
nan
是一个预先存在的对象,它永远不会与新创建的对象具有相同的ID。Python中的赋值总是简单地引用原始对象<代码>a=b;a是b将始终返回
True
,无论
b是什么。