gpt4 book ai didi

python - python对象如何存储垃圾收集的引用计数器

转载 作者:太空狗 更新时间:2023-10-30 00:56:06 24 4
gpt4 key购买 nike

我试图弄清楚 python 如何存储对象的引用计数:

getrefcount(...)
getrefcount(object) -> integer

Return the reference count of object. The count returned is generally
one higher than you might expect, because it includes the (temporary)
reference as an argument to getrefcount().
>>>

>>> s = 'string'
>>> sys.getrefcount(s)
28
>>> d = {'key' : s}
>>> sys.getrefcount(s)
29
>>> l = [s]
>>> sys.getrefcount(s)
30
>>> del l
>>> sys.getrefcount(s)
29
>>> del d
>>> sys.getrefcount(s)
28
>>>

在我上面的代码片段中,当我创建一个字符串对象 s 时,我得到了 ref-count 28,然后当我在字典中分配时,它的 ref-count 递增 1。而且我不知道为什么它以 28 开头。

所以,我在这里试图弄清楚这个值存储在哪里或者 python 如何获取它。

谢谢

最佳答案

您可以使用 gc.get_referrers 获取对象的引用者列表函数,像这样

import gc, pprint
pprint.pprint(gc.get_referrers("string"))

每个对象的引用计数都存储在对象本身中,在一个名为 ob_refcnt 的变量中

typedef struct _object {
_PyObject_HEAD_EXTRA
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
} PyObject;

对象的引用计数使用宏Py_INCREF 递增和递减。和 Py_DECREF分别。

#define Py_INCREF(op) (                         \
_Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \
((PyObject*)(op))->ob_refcnt++)

#define Py_DECREF(op) \
do { \
if (_Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA \
--((PyObject*)(op))->ob_refcnt != 0) \
_Py_CHECK_REFCNT(op) \
else \
_Py_Dealloc((PyObject *)(op)); \
} while (0)

关于python - python对象如何存储垃圾收集的引用计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21775292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com