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

为何在Python中用`is`比较类实例方法总是返回False?

为什么类实例方法用is比较返回False,普通函数却返回True?

这是个很典型的Python方法绑定问题,咱们来掰扯清楚背后的逻辑:

先还原你的测试代码,方便对照:

# 类方法的情况
class A:
    def a_method(self):
        pass
    def b(self):
        print(self.a_method is self.a_method)

c = A()
c.b()  # 输出 False
c.a_method is c.a_method  # 结果也是 False

# 普通函数的情况
def a():
    pass
a is a  # 结果是 True

核心原因:实例方法的动态绑定机制

当你通过实例访问类中的方法时(比如c.a_method),Python会悄悄做一件幕后工作:动态创建一个「绑定方法(bound method)」对象。这个对象的作用是把当前实例c和类里的原始函数A.a_method绑定在一起,这样当你调用c.a_method()时,Python能自动把c作为第一个参数self传入方法。

关键就在这里:每次你访问c.a_method,Python都会生成一个全新的绑定方法对象。这两个对象虽然功能完全一样,但它们是内存中独立的两个实例,所以用is(判断两个引用是否指向同一个内存对象)比较时,结果自然是False。

而普通函数a就不一样了:它是一个全局的函数对象,每次引用a都是直接指向同一个内存地址,所以a is a会返回True。

验证一下:直接访问类中的原始函数

如果你跳过实例,直接访问类里的方法,就会发现is比较返回True:

A.a_method is A.a_method  # 结果是 True

因为这时候你直接引用的是类中定义的原始函数对象,没有触发绑定过程,所以每次引用都是同一个对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 08:27:37