在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
这种一般行为也适用于其他集合类型,例如元组和集合。这有很好的理由吗?
Per the docs,
在加强元素的自反性时,集合的比较假设对于集合元素 x,x == x 始终为 true。基于该假设,首先比较元素同一性,并且仅针对不同元素执行元素比较。如果比较的元素是自反的,则此方法会产生与严格元素比较相同的结果。对于非自反元素,结果与严格元素比较不同,并且可能令人惊讶:例如,非自反非数字值在列表中使用时会导致以下比较行为:
>>> 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)