Python引用计数

Python引用计数,python,refcounting,Python,Refcounting,在以下Python代码中: class Foo: def bar(self): return 1 def baz(): return Foo() print baz().bar() 问题0: 当在print baz().bar()中计算bar()时,是什么使得baz()返回的Foo实例尚未被垃圾收集,因为它似乎没有引用,就像在: foo = baz() print foo.bar() 其中foo存储foo实例的引用 问题1: 如果在Python扩展模块中用

在以下Python代码中:

class Foo:
    def bar(self):
        return 1

def baz():
    return Foo()

print baz().bar()
问题0: 当在
print baz().bar()
中计算
bar()
时,是什么使得
baz()
返回的
Foo
实例尚未被垃圾收集,因为它似乎没有引用,就像在:

foo = baz()
print foo.bar()
其中
foo
存储
foo
实例的引用

问题1: 如果在Python扩展模块中用C实现了Foo和baz,那么
baz
是否应该增加返回对象
Foo
的引用计数以将其设置为1

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

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

第1部分: 与0一样,声明baz()不会创建对象。调用baz()会创建对象。每次调用函数baz时调用“Foo()”(构造函数)时,引用计数都会增加。

第0部分:有一个对
Foo
实例的引用:
Foo.bar
中的参数
self