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 引用计数的主要内容,如果未能解决你的问题,请参考以下文章

python 10

python内存管理机制

Python中的引用计数法

python的计数引用分析

云计算Python自动化:内部的引用计数

python的引用计数分析