代码之家  ›  专栏  ›  技术社区  ›  AGN Gazer

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

  •  2
  • AGN Gazer  · 技术社区  · 6 年前

    这个问题已经有了答案:

    最近我看到了一些关于表演时意外行为的问题 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 )根据中给出的答案 https://stackoverflow.com/a/48736729 ,一个新的 method 每次访问绑定方法时都会创建实例。

    如果这是正确的,并解释为什么 A.foo是A.foo 总是 ,为什么 id 这些可能是不同的 方法 对象相等:

    >>> id(a.foo) == id(a.foo)
    True
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Tim Peters    6 年前

    你在与幻觉搏斗;-)在

    id(a.foo) == id(a.foo)
    

    第一个 a.foo 被创建,其 id 然后绑定方法立即变为垃圾。在 CPython ,引用计数会立即释放其内存。相同的内存会被重新使用(尽管没有 保证 当第二个 A.Fo 已创建。 身份证件 仅保证在对象集合中的唯一性 同时 活着。

    相反,在

    a.foo is a.foo
    

    双方同时活着,所以 A.Fo 对象不能占用同一内存。做类似的事情 身份证件 S,你必须安排让他们两个在 身份证件 比较完整;例如,

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