nick_gabpe Asked:2020-02-01 23:44:10 +0000 UTC2020-02-01 23:44:10 +0000 UTC 2020-02-01 23:44:10 +0000 UTC python 中 NaN 的奇怪工作:nan != nan 和 [nan] == [nan] 772 有这个代码: a = float("nan") a == a # Получаем False [a] == [a] # Получаем True 为什么会这样? python 2 个回答 Voted Best Answer Mr Morgan 2020-02-01T23:55:38Z2020-02-01T23:55:38Z 因为在第一种情况下, NaN 属性有效。 在第二种情况下,Python 检查数组是否相等,而不是对象a。 在这种情况下[a] == [a],数组中的对象是相同的(类的相同实例),因此 Python 会像对待a普通对象一样对它们做出反应(首先通过引用进行比较)。 jfs 2020-02-02T02:29:13Z2020-02-02T02:29:13Z 这里有一些不一致之处。 一方面,在 CPython 中,返回 C 在此系统上为- nan != nan返回的值:nanfloat_richcompare() 当 x 和/或 y 是 NaN 时,Python x == y 提供与平台 C x == y 相同的结果。 这意味着 IEEE 754 行为通常是:NaN 甚至不等于自身。 另一方面,比较列表的元素使用首先检查参数是否引用同一个对象的比较,而不为 -case 调用等号运算符a==b( ) a is b: PyObject_RichCompareBool() 对象相同时的快速结果。保证身份意味着平等。 因此[nan] == [nan](因为nan is nan),尽管nan != nan. 形式上,Python(不管实现如何)保证对于 是x == x假的 x = float('NaN'),但在诸如列表之类的集合x == x中总是被认为是真的: 集合的比较假定对于集合元素 x,x == x 始终为真。
因为在第一种情况下, NaN 属性有效。
在第二种情况下,Python 检查数组是否相等,而不是对象
a。在这种情况下
[a] == [a],数组中的对象是相同的(类的相同实例),因此 Python 会像对待a普通对象一样对它们做出反应(首先通过引用进行比较)。这里有一些不一致之处。
一方面,在 CPython 中,返回 C 在此系统上为-
nan != nan返回的值:nanfloat_richcompare()这意味着 IEEE 754 行为通常是:NaN 甚至不等于自身。
另一方面,比较列表的元素使用首先检查参数是否引用同一个对象的比较,而不为 -case 调用等号运算符
a==b( )a is b:PyObject_RichCompareBool()因此
[nan] == [nan](因为nan is nan),尽管nan != nan.形式上,Python(不管实现如何)保证对于 是
x == x假的x = float('NaN'),但在诸如列表之类的集合x == x中总是被认为是真的: