为什么在numpy`nan == nan`中是假的,而nan在[nan]中是真的?

sas*_*llo 33 python numpy nan

虽然问题的第一部分(标题中)已经被回答了几次(即,为什么NaN不等于NaN?),我不明白为什么第二部分的工作方式(灵感)通过这个问题如何检查包含NaN的列表

即:

>> nan == nan
False

>> nan in [nan]
True
Run Code Online (Sandbox Code Playgroud)

考虑@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)
Run Code Online (Sandbox Code Playgroud)

基本上,它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]
Run Code Online (Sandbox Code Playgroud)

DSM*_*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
Run Code Online (Sandbox Code Playgroud)

你的附录并没有多大关系 nan,这就是Python的工作方式.一旦你明白float("nan")没有义务返回一些南单身,并且y = x没有复制x但是将名称绑定到名为y的对象x,就没有什么可以得到的了.

  • 不,正如我在原始问题中所说,nans不是唯一的对象.看看上面的成绩单:两个`nan`s有不同的id,`nans [0]是nans [1]`是假的.`nan in [nan]`是真的,因为它基本上是'任何(x是纳米,x = =纳米,x为[纳米]).`x is nan`是真的,所以`x == nan`是假的并不重要.同样的规则应用于`nan in [float("nan")]`赋予`x is nan`为False(它们是不同的对象),而`x == nan`仍为False.`float("nan")中的`float("nan")赋予False,因为它们是两个单独的NANS. (3认同)
  • @sashkello:你指的是第一个例子?你的'nan == nan`?`nan`命名一个特定的对象(在这种情况下,我很确定它是`np.nan`).无论你说出多少次这个名字,它仍然指的是同一个对象:没有初始化.类似地,`x = nan`不会复制`nan`,它只会使`x`成为一个新名称,并说它命名的对象也是由`nan`命名的.例如,在这样做之后尝试`x is nan`. (2认同)