我读了这一行:
“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
>>>
如果我错了,请纠正我或解释我是怎么回事?
答案 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。