我有一些具有相同维度的元组,其中一些包含None
或NaN
元素。
我虽然里面有NaN
的那些人不会比较等于,但事实上有些人比较等于。
我已阅读Python文档中的Value Comparisons,特别是部分说:
序列使用对应的比较按字典顺序进行比较 元素,强制执行元素的反身性。
在强制元素的反身性时,对集合进行比较 假设对于集合元素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
这是让我提出问题的MCVE:
import numpy as np
# [1]
x = (12, float('nan'), 'test')
x == (12, float('nan'), 'test') # False
# [2]
y = (12, np.nan, 'test')
y == (12, np.nan, 'test') # True
# [3]
u = float('nan')
q = (12, u, 'test')
q == (12, u, 'test') # True
# [4]
v = (12, None, 'test')
v == (12, None, 'test') # True
所以,如果我已经正确理解 - 让我们谈谈相同长度的容器 - 容器比较的工作原理如下:
x_i is y_i
; x_i == y_i
; False
,否则为True
。 这有点令人惊讶!
我也发现numpy.nan
是单身人士:
np.nan is np.nan # True
它不像是:
class test:
@property
def nan(self):
return float('nan')
inst = test()
inst.nan is inst.nan # False
我的问题是: