Python 引用计数
Posted
技术标签:
【中文标题】Python 引用计数【英文标题】:Python reference count 【发布时间】:2014-07-04 19:03:27 【问题描述】:在以下 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
实例的引用。
问题一:
如果 Foo 和 baz 在 Python 扩展模块中用 C 语言实现,baz
是否应该增加返回对象 foo
的引用计数以将其设置为 1?
【问题讨论】:
第 0 部分:is 引用了Foo
实例:Foo.bar
中的参数 self
。
【参考方案1】:
答案 0:当bar()
被调用时,bar 是一个绑定方法(绑定到Foo
实例),它保留了对其self
参数的引用,即@ 987654324@ 实例。
【讨论】:
【参考方案2】:对于第 0 部分: 每次调用 baz 时,它都会创建一个新对象 Foo。您可以通过向 Foo 添加 init 来看到这一点。因此,在打印之前, Foo 实例不存在。 (它不是在声明函数 baz 时创建的,而是仅在调用它时创建。
第 1 部分: 与 0 一样,声明 baz() 不会创建对象。调用 baz() 可以。每次调用函数 baz 时,引用计数都会增加。
【讨论】:
以上是关于Python 引用计数的主要内容,如果未能解决你的问题,请参考以下文章