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

 手机用户2502936971 发布于 2023-02-13 15:09

虽然问题的第一部分(标题中)已经被回答了几次(即,为什么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]

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

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

1 个回答
  • 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
    

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

    2023-02-13 15:12 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有