gpt4 book ai didi

python - math.nan 与 'in' 运算符结合时的矛盾行为

转载 作者:太空狗 更新时间:2023-10-29 20:22:23 26 4
gpt4 key购买 nike

我有以下几行代码:

import math as mt

...
...
...

if mt.isnan (coord0):
print (111111, coord0, type (coord0), coord0 in (None, mt.nan))
print (222222, mt.nan, type (mt.nan), mt.nan in (None, mt.nan))

它打印:

111111 nan <class 'float'> False
222222 nan <class 'float'> True

我很迷茫...有什么解释吗?

Python 3.6.0、Windows 10

我对 Python 解释器的质量有坚定的信心......而且我知道,每当计算机看起来出错时,实际上是我弄错了......那我错过了什么?

[编辑]

(对@COLDSPEED 的 react )

确实 ID 不同:

print (111111, coord0, type (coord0), id (coord0), coord0 in (None, mt.nan))
print (222222, mt.nan, type (mt.nan), id (mt.nan), mt.nan in (None, mt.nan))

打印:

111111 nan <class 'float'> 2149940586968 False
222222 nan <class 'float'> 2151724423496 True

也许 whey nan 不是真正的单例是有充分理由的。但我还不明白。在我看来,这种行为很容易出错。

[编辑2]

(回应@Sven Marnach)

仔细阅读@Sven Marnach 的回答让我明白了。这确实是设计事物时遇到的那种妥协。

冰还是很薄:

Having a in (b,) return True if id (a) == id (b) 似乎与nan 不等于 nan 的 IEEE-754 标准。

结论必须是,虽然 a 在聚合中,但同时它又不是,因为聚合中的东西,即 b 有被 IEEE 标准认为不等于 a

我想从现在开始我会使用 isnan...

最佳答案

您看到的行为是对 Python 中的 in 运算符的优化以及 nan 与自身比较不相等的事实的人工制品,如 IEEE-754 所要求的标准。

Python 中的in 运算符返回迭代器中的任何元素是否等于您要查找的元素。表达式 x in it 本质上计算为 any(x == y for y in it),除了 CPython 应用了额外的优化:以避免必须调用 __eq__ 在每个元素上,解释器首先检查 xy 是否是相同的对象,在这种情况下它立即返回 True.

这种优化几乎适用于所有对象。毕竟,每个对象都将自己与自己进行比较,这是相等性的基本属性之一。但是, float 的 IEEE-754 标准要求 nan != nan,因此 NaN 打破了这个假设。这会导致您看到奇怪的行为:如果一个 nan 恰好是迭代器中的 同一对象 作为 nan,则上述优化导致 in 运算符返回 True。但是,如果迭代器中的 nan 不是同一个对象,Python 会回退到 __eq__(),你会得到 False

关于python - math.nan 与 'in' 运算符结合时的矛盾行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48808149/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com