Python引用计数



在以下Python代码中:

class Foo:
    def bar(self):
        return 1
def baz():
    return Foo()
print baz().bar()
0

问题:

bar()print baz().bar()中求值时,是什么使得baz()返回的Foo实例还没有被垃圾收集,因为似乎没有对它的引用,就像在:

foo = baz()
print foo.bar()

where foo存储Foo实例的引用。

问题1:

如果Foo和baz是在Python扩展模块中用C实现的,baz应该增加返回对象foo的引用计数以将其设置为1吗?

答案0:当bar()被调用时,bar是一个绑定方法(绑定到Foo实例),它保持对其self参数的引用,即Foo实例。

对于第0部分:每次调用baz时,它都会创建一个新对象Foo。您可以通过在Foo中添加一个init来看到这一点。因此,在打印之前,Foo实例不存在。(它不是在声明函数baz时创建的,而是在调用它时创建的。

第1部分:与0一样,声明baz()并不创建对象。调用baz()可以。当每次调用函数baz时调用'Foo()'(构造函数)时,引用计数递增。

最新更新