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

时间:2018-05-24 05:16:13

标签: python

最近,我在同一对象的同一绑定方法上执行is测试时看到了几个关于意外行为的问题。具体来说,请参阅问题Why does `instance_of_object.foo is instance_of_object.foo` evaluate False?Two methods inherited from one method in class are different in instances, aren't they?

让我们描述一下这个问题,例如,如上面第一个相关问题所述。我们假设一个班级:

class A(object):
  def foo(self):
    pass

然后在这个问题中观察到的奇怪的事情是,如果我们创建A类型的对象,例如a = A(),那么测试a.foo is a.foo将失败(返回False)。根据{{​​3}}中给出的答案,每次访问绑定方法时都会创建一个新的method实例。

如果这是正确的,并解释了为什么a.foo is a.foo总是False,为什么这些可能不同的id对象的method是相同的:

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

1 个答案:

答案 0 :(得分:2)

你正在与幻想摔跤;-)在

func collectionView(_ collectionView: UICollectionView, 
dragPreviewParametersForItemAt indexPath: IndexPath) -> 
UIDragPreviewParameters?

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

相比之下,

id

双方同时存活,因此不同的a.foo is a.foo 对象不能占用相同的内存。要对a.foo做类似的事情,你必须安排让它们保持足够长时间以便完成id比较;如,

id