代码之家  ›  专栏  ›  技术社区  ›  ead

将NaNs添加到集合时不一致行为的原因

  •  3
  • ead  · 技术社区  · 7 年前

    Python的set与 NaN s公司( 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
    

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

    1 回复  |  直到 7 年前
        1
  •  5
  •   wim    7 年前

    在考虑相等性检查(CPython source在 setobject.c ,另请参见下面的注释 PyObject_RichCompareBool ).

    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:哦,好吧。 特殊情况不足以打破规则 . 所有血淋淋的细节,见bpo 发行4296 :

    Python assumes identity implies equivalence; contradicts NaN .