为什么Python在创建时为对象创建两个refcounts?

Aar*_*all 4 python memory memory-management

因此,当我创建一个没有引用的对象时(据我所知)为什么Python会维护它有一个refcount呢?

>>> import sys
>>> sys.getrefcount(object())
1
Run Code Online (Sandbox Code Playgroud)

基于这个额外的引用计数,以下内容是有意义的.

>>> o = object()
>>> sys.getrefcount(o)
2
>>> l = list((o,))
>>> sys.getrefcount(o)
3
>>> del l[0]
>>> sys.getrefcount(o)
2
Run Code Online (Sandbox Code Playgroud)

似乎就是这样

>>> del o
Run Code Online (Sandbox Code Playgroud)

Python会垃圾收集对象,但它呢?如果还有参考,那是哪里?

sle*_*ica 7

调用时sys.getrefcount(),将生成一个引用以供函数内部的本地使用.getrefcount()将总是将1添加到实际计数,因为它计算自己的内部参考.


Far*_*Joe 6

getrefcount当您的参数传递给函数时,Python会计算函数内创建的引用.

返回对象的引用计数.返回的计数通常比您预期的高一个,因为它包含(临时)引用作为getrefcount()的参数.

来自Python文档

至于垃圾收集,Python将在调用o时删除存储在变量中的引用del o.基本上sys.getrefcount总是至少返回,1因为它需要在函数内创建对参数的引用,以便计算对传递参数的任何其他引用.请参阅以下输出作为一个示例,希望能够对此有所了解.

>>> o = object()
>>> import sys
>>> sys.getrefcount(o)
2
>>> del o
>>> sys.getrefcount(o)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'o' is not defined
Run Code Online (Sandbox Code Playgroud)

我们可以看到此引用已被删除,垃圾收集器现在将在下一次扫描时收集这些引用,因为对第一行上创建的对象没有可用的引用. 讨论与该del方法相关的Python垃圾收集.