引用python对象

时间:2017-05-19 00:50:38

标签: python cpython reference-counting

我试图理解refcounts如何在python中工作,有人可以解释为什么当它只有1个对象实例时,计数被打印为2? (是因为临时传递给getrefcount方法?)另外,为什么从成员调用时调用的数字更多(是自引用是否会引起引用?)

import sys

class A:
    def print_ref_count(self):
        print sys.getrefcount(self)

a = A()
print sys.getrefcount(a)   # prints 2
a.print_ref_count()        # prints 4
print sys.getrefcount(a)   # prints 2

1 个答案:

答案 0 :(得分:2)

Python中到处都有隐式引用增量。当您将a作为参数传递给函数时,它会逐渐增加,如getrefcount自己的文档字符串注释:

  

返回的计数通常比您预期的高一个,因为它包含(临时)引用作为getrefcount()的参数。

调用方法时的两个附加引用分别为:

  1. 方法<{li>中名称self持有的引用
  2. 当您执行a.print_ref_count时(甚至在实际调用它之前)创建特定于该实例的绑定方法对象时创建的隐式引用; type(a.print_ref_count)是一个临时绑定方法,必须包含对实例和方法本身的引用(您可以to_print = a.print_ref_count,然后del ato_print必须仍然可以工作虽然a不再引用实例)
  3. 挂起参考计数并不是很有帮助;它是Python的一个实现细节(特别是CPython;其他Python解释器可以并且确实使用非引用计数垃圾收集),正如您所看到的,创建了许多隐式引用,它们实际上可能根本不存储在命名变量中。