【问题标题】:Why (nan,)==(nan,) is True when nan==nan is False? [duplicate]当 nan==nan 为 False 时,为什么 (nan,)==(nan,) 为 True? [复制]
【发布时间】:2020-03-12 22:52:41
【问题描述】:

我只是觉得这有点奇怪。环境是Python v3,虽然它看起来对我来说很好表达

import numpy as np
np.nan==np.nan

在元组中使用时返回False

(np.nan,)==(np.nan,)

它返回True

【问题讨论】:

  • 因为。元组相等的处理方式与 nan-equality 不同?除此之外 - 你可能想使用 np.isnan(np.nan) - 这会导致 True - 所以也许 Tuple 使用了正确的 NaN 检测......不过只是一个猜测
  • 好吧,我不认为它是重复的。那是关于元组而不是列表
  • 虽然成员资格测试和元组相等性都检查了身份,但这并不能使这些问题相同。

标签: python tuples


【解决方案1】:

如 numpy 文档中所述:

np.nan == np.nan # 总是错误的!请改用特殊的 numpy 函数。

我假设在比较元组时,会一个接一个地检查值,但在幕后检查与显式比较不同,尤其是==检查。

例如,通过比较 id(elem) 值进行检查,这对于两个不同的 numpy.nan 必须相同,因此它返回 true。此外,在非 cpython 实现中,由于存储变量值的内部优化,结果很可能是错误的。

此外,您可以查看 numpy.nan 的魔术实现,这可能会让您在比较操作中更加了解幕后发生的事情。

【讨论】:

  • 正确,根据value comparisons“内置容器通常假定相同的对象与其自身相同。”因此,从未测试过nan 特有的不等式。此外,array.array('f', [math.nan]) 与自身比较不相等。
猜你喜欢
  • 2013-12-17
  • 2013-11-26
  • 2012-04-19
  • 2014-05-01
  • 1970-01-01
相关资源
最近更新 更多