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()
,那么testA.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