将元素添加到列表时引用计数

时间:2015-06-08 01:42:12

标签: python list reference

来自listobject.h

我读了这一行:

“PyList_SetItem不会增加新项目的引用 count,但确实减少了它替换的项目的引用计数, 如果不是零。如果不是,它会递减引用计数 插入列表中。类似地,PyList_GetItem不会递增 返回项目的引用计数。“

但是当我测试时,元素的引用数量增加了。

>>> a = 'abc'
>>> sys.getrefcount(a)
3
>>> ls = [1,2]
>>> ls.append(a)
>>> ls
[1, 2, 'abc']
>>> sys.getrefcount(a)
4
>>> ls.insert(1,a)
>>> sys.getrefcount(a)
5
>>>

如果我错了,请纠正我或解释我是怎么回事?

2 个答案:

答案 0 :(得分:1)

append的实施知道PyList_SetItem的这个怪癖,并处理引用计数增量。

这是它唯一可行的方法。引用计数实际上是实现的一个方面,尽管 - getrefcount - 不是Python程序员必须处理的事情。

换句话说,如果你在C中编写扩展名,你只需要担心API是窃取引用还是引用新引用。如果你坚持使用Python,那么你是安全的。

答案 1 :(得分:1)

这基本上意味着来电者PyList_SetItem必须负责引用计数;

如果是append,则会在PyList_Append中实施,这是一个简单的包装器app1(PyListObject *, PyObject *)it is in fact increasing the refrence count.

PyList_Insert也会调用ins1(PyListObject *, Py_ssize_t, PyObject *)increases the referene count