Python 向集合中添加NAN时行为不一致的原因
Python集合与Python 向集合中添加NAN时行为不一致的原因,python,python-3.x,cpython,python-internals,Python,Python 3.x,Cpython,Python Internals,Python集合与NaNs()的结合存在令人费解的行为(至少对我来说是如此): 起初,我错误地假设这是==-运算符的行为,但显然不是这样,因为这两种情况都会产生False,正如预期的那样(): 我主要对这种行为的原因感兴趣。但是,如果有一种方法可以确保一致的行为,那也很高兴知道 set membership在考虑相等性检查之前,将身份检查作为短路进行(CPython源在,另请参见下面的注释) Python核心开发人员受到以下不变量的驱动: for a in container: asse
NaN
s()的结合存在令人费解的行为(至少对我来说是如此):
起初,我错误地假设这是==
-运算符的行为,但显然不是这样,因为这两种情况都会产生False
,正如预期的那样():
我主要对这种行为的原因感兴趣。但是,如果有一种方法可以确保一致的行为,那也很高兴知道 set membership在考虑相等性检查之前,将身份检查作为短路进行(CPython源在,另请参见下面的注释) Python核心开发人员受到以下不变量的驱动:
for a in container:
assert a in container # this should ALWAYS be true
因此:
决定确保这些不变量是最重要的优先事项,至于NaN:哦,好吧。特殊情况不足以违反规则。有关所有血淋淋的详细信息,请参见bpo第4296期:
.Python的容器假定
=
是一个等价关系。如果不是这样,遏制的概念就会分崩离析。首先,你不应该把NaN放在一个集合中。可能相关:另请参见。
>>> float('nan') == float('nan')
False
>>> nan = float('nan')
>>> nan == nan
False
for a in container:
assert a in container # this should ALWAYS be true
assert a in [a]
assert a in (a,)
assert a in {a}