包含非自反元素的集合的比较

时间:2016-08-05 01:15:56

标签: python

在python中,值x并不总是被约束为自己。也许最着名的例子是NaN

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

现在考虑一个项目的列表。我们可能会认为两个这样的列表相等当且只有它们包含的项目相等。例如:

>>> ["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

此一般行为也适用于其他集合类型,例如元组和集合。对此有充分的理由吗?

1 个答案:

答案 0 :(得分:7)

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