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

Python中类本身(类型)的比较机制及底层原理问询

Python中类比较的底层逻辑:type(v) == int vs type(v) is int

一、type(v) == int的工作原理

当比较两个类(比如type(v)返回的类对象和int类)时,本质是调用类对象的__eq__方法。由于所有Python类都是type元类的实例,默认情况下使用的是type元类继承自object的__eq__实现——这个实现的逻辑就是比较对象的内存地址是否相同,和is的行为一致。

但如果某个类(或其元类)重写了__eq__方法,==的比较逻辑会被修改。比如自定义一个类,让它和int用==比较时返回True:

class MyInt(int):
    def __eq__(self, other):
        return other is int

print(MyInt == int)  # 输出True,但MyInt和int是不同的类

二、为什么优先使用is而非==

  • 结果可靠:is直接比较对象的内存地址,不受类的__eq__方法重写的影响,能准确判断两个类是否是同一个实例。
  • 语义清晰:检查变量类型时,核心需求通常是确认它的类型是否为某个特定的类(比如int本身),而非“某个与int相等的类”,is更贴合这个语义。
  • 性能更优:is是底层的指针比较,无需调用额外的方法,执行速度比==更快。

三、类比较的底层机制(CPython)

在CPython中,类对象(type的实例)的默认相等比较逻辑由object.__eq__实现,核心就是比较两个对象的内存地址(即是否为同一个对象)。type元类本身没有重写__eq__,所以普通类之间的==比较默认和is一致。

如果要查看相关底层源码,可以在CPython的Objects/typeobject.c文件中找到type_richcompare函数,它负责处理类对象的比较操作。当没有自定义的__eq__方法时,最终会回退到默认的身份比较逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:41:33