You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何NaN在Python列表包含检查中与自身判等结果矛盾?

为什么x == x为False,但x in [x]却返回True?

这是因为Python列表的__contains__方法(也就是in运算符背后的实现),在判断元素是否存在时,会优先检查对象的身份(即is关键字的判断逻辑),只有当两个对象不是同一个身份时,才会调用__eq__方法做相等性比较。

具体到NaN的场景:

当你执行x = float('nan')后,[x]里的元素就是x这个对象本身。执行x in [x]时,Python首先判断x is x(同一个对象,身份相同),直接返回True,完全不会触发==的比较,所以哪怕x == x是False,也不影响最终结果。

自定义类的场景同理:

你定义的Example类里__eq__总是返回False,但执行x in [x]时,列表里的元素就是x自身,身份判断通过,直接返回True,不会调用你写的__eq__方法。如果换两个不同的实例:

x = Example()
y = Example()
print(x in [y])  # 输出False,因为x和y身份不同,会调用__eq__,返回False

补充验证:

你可以修改自定义类,给__eq__加个打印,就能看到什么时候会被调用:

class Example:
    def __eq__(self, other):
        print("__eq__被调用了")
        return False

x = Example()
print(x == x)   # 会打印"__eq__被调用了",输出False
print(x in [x]) # 不会打印任何内容,直接输出True

内容的提问来源于stack exchange,提问作者Silvio Mayolo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 12:57:36