在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
此一般行为也适用于其他集合类型,例如元组和集合。对此有充分的理由吗?
答案 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