【问题标题】:Causes for inconsistent behavior when adding NaNs to a set将 NaN 添加到集合时导致行为不一致的原因
【发布时间】:2019-01-08 08:42:19
【问题描述】:

Python 的集合与NaNs (here live) 相结合的行为令人费解(至少对我而言):

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

起初,我错误地认为这是==-operator 的行为,但显然情况并非如此,因为两种情况都按预期产生False (here live):

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

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

【问题讨论】:

  • Python 的容器假定== 是等价关系。如果不是这样,遏制的概念就会分崩离析。首先,您不应该将 NaN 放在集合中。
  • 另见here

标签: python python-3.x cpython python-internals


【解决方案1】:

在考虑相等性检查之前,设置成员身份会作为短路进行身份检查(CPython 源代码位于 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 issue4296

Python assumes identity implies equivalence; contradicts NaN.

【讨论】:

    猜你喜欢
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2021-12-24
    • 2016-10-29
    • 1970-01-01
    相关资源
    最近更新 更多