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

