最近,我在同一对象的同一绑定方法上执行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
答案 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