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
相关产品推荐
相关产品推荐

