【问题标题】:Why does Python create two refcounts for an object on creation?为什么 Python 在创建时为一个对象创建两个引用计数?
【发布时间】:2013-11-22 22:05:36
【问题描述】:

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

>>> import sys
>>> sys.getrefcount(object())
1

根据这个额外的引用计数,以下是有意义的。

>>> o = object()
>>> sys.getrefcount(o)
2
>>> l = list((o,))
>>> sys.getrefcount(o)
3
>>> del l[0]
>>> sys.getrefcount(o)
2

似乎在

>>> del o

Python 会垃圾收集对象,但它会吗?如果还有对它的引用,那在哪里?

【问题讨论】:

    标签: python memory memory-management


    【解决方案1】:

    当您调用sys.getrefcount() 时,会生成一个引用以供函数内部使用。 getrefcount() 将始终将实际计数加 1,因为它会计算自己的内部参考。

    【讨论】:

      【解决方案2】:

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

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

      From the Python documents

      对于垃圾回收,Python 会在调用del o 时删除存储在变量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
      

      我们可以看到该引用已被删除,垃圾收集器现在将在下一次扫描时收集这些引用,因为不再有对在第一行创建的对象的可用引用。 Discussion of Python garbage collection in relation to the del method.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-13
        • 1970-01-01
        • 2016-09-24
        • 1970-01-01
        相关资源
        最近更新 更多