Python引用计数
在以下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扩展模块中用
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
。