将nan添加到s时行为不一致的原因

2024-04-25 00:30:10 发布

您现在位置:Python中文网/ 问答频道 /正文

Python的set与NaNs(here live)的结合有一个令人费解的行为(至少对我来说):

>>> float('nan') in {float('nan')}    # example 1
False
>>> nan = float('nan')                # example 2
>>> nan in {nan}
True

一开始,我错误地假设这是==-操作符的行为,但情况显然不是这样,因为这两种情况都会产生False预期的结果(here live):

>>> float('nan') == float('nan') 
False
>>> nan = float('nan')
>>> nan == nan
False

我主要对这种行为的原因感兴趣。但如果有一种方法可以确保行为的一致性,那也很高兴知道!你知道吗


Tags: 方法inlivefalsetruehereexample错误
1条回答
网友
1楼 · 发布于 2024-04-25 00:30:10

set membership在考虑相等性检查之前做一个短路身份检查(CPython源在^{}中,另请参见下面的注释^{})。你知道吗

Python核心开发人员的动机是这些不变量:

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}

决定确保这些不变量是最重要的优先事项,至于NaN:oh。特殊情况不足以打破规则。有关所有血淋淋的细节,请参见bpo问题4296

Python assumes identity implies equivalence; contradicts NaN。你知道吗

相关问题 更多 >