【问题标题】:Comparison of collections containing non-reflexive elements包含非自反元素的集合的比较
【发布时间】:2016-08-05 01:15:56
【问题描述】:

在 python 中,值x 并不总是被限制为等于自身。也许最著名的例子是NaN

>>> x = float("NaN")
>>> x == x
False

现在考虑一个只有一个项目的列表。我们可以认为两个这样的列表是equal,如果且只有它们包含的项目是equal。例如:

>>> ["hello"] == ["hello"]
True

NaN 似乎并非如此:

>>> x = float("NaN")
>>> x == x
False
>>> [x] == [x]
True

所以这些“不相等”的项目列表是“相等的”。但只是有时……特别是:

  • NaN 的相同实例组成的两个列表被认为是相等的;而
  • NaN 的不同实例组成的两个单独的列表不相等

观察:

>>> x = float("NaN")
>>> [x] == [x]
True
>>> [x] == [float("NaN")]
False

这种一般行为也适用于其他集合类型,例如元组和集合。这有什么好的理由吗?

【问题讨论】:

  • 如果您想要与不相等的 NaN 进行比较,您可以使用 NumPy,它会这样认为:(np.array(a) == np.array(b)).all() 将返回 False 如果有任何 NaN .

标签: python


【解决方案1】:

the docs

在强制元素的自反性时,集合的比较假定对于集合元素 x,x == x 始终为真。基于该假设,首先比较元素身份,并且仅对不同元素执行元素比较。如果比较的元素是自反的,这种方法会产生与严格元素比较相同的结果。对于非自反元素,结果与严格元素比较的结果不同,并且可能令人惊讶:例如,当在列表中使用时,非自反非数字值会导致以下比较行为:

 >>> nan = float('NaN')
 >>> nan is nan
 True
 >>> nan == nan
 False                 <-- the defined non-reflexive behavior of NaN
 >>> [nan] == [nan]
 True                  <-- list enforces reflexivity and tests identity first

【讨论】:

  • 除了方便(或许还有比较效率)之外,集合是否有自反性的已知理由?
  • 这可能是历史的偶然。请参阅PEP207:“自反性规则由 Python 假定。因此,解释器可以将 y>x 与 x=x 与 xlist.__eq__ 是用假设 x!=x 永远不可能是真的,尽管事实证明,这不应该被假设。
  • 这很有趣……你对this question有意见吗?
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
相关资源
最近更新 更多