【问题标题】:Python reference countPython 引用计数
【发布时间】: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

标签: python refcounting


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 2017-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多