技术咨询:为何float('nan') == float('nan')返回False?
为什么
float('nan') == float('nan')返回False,且NaN不在包含它的列表里? 这问题太典型了,其实根源是IEEE 754浮点标准对NaN的特殊定义,咱们一步步拆解:
1. 为什么NaN不等于它自己?
NaN(Not a Number)代表的是“无效的数值结果”——比如0除以0、负数开平方这类运算的产物。IEEE 754标准明确规定:NaN和任何值(包括它自己)的相等比较结果都是False。
举个直观的例子:
print(float('nan') == float('nan')) # 输出: False
毕竟连“它是什么确定值”都没法定义,自然没法和任何东西(包括自己)划等号对吧?
2. 为什么foo in [bar, float('nan')]始终返回False?
Python里的in运算符检查列表成员时,本质是逐个用==比较列表元素和目标值。既然NaN和自己用==比都是False,那不管列表里有没有NaN,foo in ...的结果肯定是False。
比如:
foo = float('nan') print(foo in [1, float('nan')]) # 输出: False
哪怕列表里明明白白有个NaN,也过不了==这一关。
那该怎么正确判断NaN?
别用==,用专门的判断工具:
- 用
math.isnan()精准判断单个值:
import math foo = float('nan') print(math.isnan(foo)) # 输出: True
- 如果要检查列表里是否存在NaN,可以遍历列表逐个验证:
import math my_list = [3.14, float('nan'), 2.718] has_nan = any(math.isnan(x) for x in my_list) print(has_nan) # 输出: True
内容的提问来源于stack exchange,提问作者Tommy
相关产品推荐
相关产品推荐

