Python 为什么同一对象的同一绑定方法的ID相等?

Python 为什么同一对象的同一绑定方法的ID相等?,python,Python,最近,我看到了一些关于在同一对象的同一绑定方法上执行is测试时出现意外行为的问题。具体而言,请参见问题和建议 例如,让我们描述一下这个问题,如上面第一个链接问题所述。让我们假设一个类: class A(object): def foo(self): pass 然后在这个问题中观察到的奇怪的事情是,如果我们创建一个A类型的对象,比如A=A(),那么testA.foo就是A.foo失败(返回False)。根据中给出的答案,每次访问绑定方法时都会创建一个新的方法实例 如果这是正确的,并且

最近,我看到了一些关于在同一对象的同一绑定方法上执行
is
测试时出现意外行为的问题。具体而言,请参见问题和建议

例如,让我们描述一下这个问题,如上面第一个链接问题所述。让我们假设一个类:

class A(object):
  def foo(self):
    pass
然后在这个问题中观察到的奇怪的事情是,如果我们创建一个
A
类型的对象,比如
A=A()
,那么test
A.foo就是A.foo
失败(返回
False
)。根据中给出的答案,每次访问绑定方法时都会创建一个新的
方法
实例

如果这是正确的,并且解释了为什么
a.foo是a.foo
总是
False
,为什么这些假定不同的
方法
对象的
id
s是相等的:

>>> id(a.foo) == id(a.foo)
True

你在与幻想搏斗;-)在

创建第一个
a.foo
,获取其
id
,然后绑定方法立即变成垃圾。在
CPython
中,引用计数导致立即释放其内存。当创建第二个
a.foo
时,相同的内存碰巧被重用(尽管不能保证会发生这种情况)<代码>id仅保证在同时活动的对象集合中唯一

相反,在

a.foo is a.foo
两侧同时处于活动状态,因此不同的
a.foo
对象不能占用相同的内存。要对
id
s执行类似的操作,您必须安排让它们保持足够长的生存时间,以便
id
比较完成;e、 g

>>> a1 = a.foo
>>> id(a1) == id(a.foo)
False

呃,我的错。我错过了这个。谢谢别担心!真正的Python专家也被这一点欺骗了:-)
>>> a1 = a.foo
>>> id(a1) == id(a.foo)
False