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

为何调用hex()函数后,同一个方法的id()值会发生变化?

为什么实例方法的id()会返回不同值?

这是Python的预期行为,核心原因在于:当你访问a.test这类实例方法时,Python不会直接返回类里定义的函数对象,而是动态创建一个临时的绑定方法对象(bound method)——这个对象会把实例a和类方法Test.test绑定在一起。

如果这个临时绑定方法对象没有被变量引用,会很快被Python的垃圾回收机制回收,它占用的内存地址会被释放,后续创建的新绑定方法对象可能会复用或使用新的地址。

第一个示例的解释

>>> id(a.test), id(a.test), id(a.test), hex(1), id(a.test)
(1662807685632, 1662807685632, 1662807685632, '0x1', 1662813074048)

前三次调用id(a.test)返回相同地址,是因为这几个临时绑定方法对象被连续创建,前一个还没来得及被回收,内存地址就被复用了。而中间插入的hex(1)操作,给了垃圾回收机制时间,之前的临时对象被回收、内存地址释放,所以第四次创建的绑定方法对象用了新的地址。

第二个奇怪现象的解释

>>> id(a.test) == id(a.test)
True
>>> hex(id(a.test)) == hex(id(a.test))
False
  • 第一行中,两个id(a.test)是连续执行的:第一个绑定方法对象刚创建还没被回收,第二个绑定方法对象就占用了同一个刚释放的内存地址,所以id相同,结果为True。
  • 第二行中,两次id(a.test)之间插入了hex()调用,这个额外操作让垃圾回收机制有时间回收第一个临时对象,内存地址被释放后,第二个绑定方法对象用了新地址,因此两次id的十六进制结果不同。

验证方法

如果把绑定方法对象保存到变量中,它就不会被立即回收,此时id会保持稳定:

>>> method1 = a.test
>>> method2 = a.test
>>> id(method1), id(method2)  # 两个不同的绑定方法对象,id不同
(1662807685632, 1662813074048)
>>> id(method1) == id(method1)  # 同一个对象,id始终相同
True

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:42:37