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

为何CPython中对象方法赋值后,变量与原方法is比较返回False且id不同(repr却一致)?

解答:为什么绑定方法的repr地址相同但身份比较为False?

这个现象其实是CPython处理实例方法绑定的典型细节,咱们一步步拆解清楚:

核心原因:每次访问实例方法都会生成新的绑定方法对象

当你访问a_string.upper这类实例方法属性时,Python并不会直接返回str.upper这个原始函数,而是动态创建一个全新的「绑定方法对象」——这个对象的作用是把实例a_string和底层函数str.upper绑定在一起,确保调用时自动把实例作为self参数传入。

换句话说:

  • 第一次访问a_string.upper时,生成绑定方法对象M1
  • 将M1赋值给a_method后,再次访问a_string.upper时,会生成另一个完全独立的绑定方法对象M2
    M1和M2是内存中两个不同的对象,所以它们的id()返回值不同,用is做身份比较自然返回False。

为什么repr显示的地址看起来相同?

你仔细观察repr的输出:

<built-in method upper of str object at 0x7fb01c024760>

这里的0x7fb01c024760不是绑定方法对象自身的地址,而是被绑定的实例a_string的内存地址!

绑定方法的repr逻辑是:展示底层方法名 + 被绑定实例的信息(包括实例地址)。所以只要两个绑定方法关联的是同一个实例和同一个底层函数,它们的repr字符串就会完全一致——哪怕这两个绑定方法本身是完全独立的对象。

你可以验证一下:执行id(a_string),得到的数值就是0x7fb01c024760转换成十进制后的结果,和repr里的地址完全对应。

为什么调用结果完全一致?

不管是a_method()还是a_string.upper(),本质上都是在执行str.upper(a_string)——两个绑定方法对象都关联了同一个实例a_string和同一个底层函数str.upper,最终执行的逻辑完全相同,返回结果自然一致。

再梳理代码里的现象对应关系

  • a_method()和a_string.upper()结果相同:二者都是绑定到a_string的方法,执行逻辑完全一致
  • repr(...)相等:repr显示的是实例的地址,而非绑定方法自身的地址
  • is比较返回False:两个绑定方法是内存中独立的对象
  • id()不同:对应两个不同绑定方法对象的内存地址

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 10:17:29