释放PyTuple对象

时间:2011-02-04 12:52:10

标签: python c python-c-api python-c-extension

使用Python C-API释放PyTuple对象的正确方法是什么?

我知道元组在引用计数语义方面有点特殊,因为PyTuple_SetItem窃取”对插入元素的引用。我也知道减少元组对象的引用会减少元组中所有元素的引用计数。

考虑到这一点,我认为应该安全地说:

#include <Python.h>
#include <stdio.h>

int main()
{
    PyObject* tup = PyTuple_New(1);
    PyTuple_SetItem(tup, 0, PyLong_FromLong(100L));

    printf("Ref Count: %d\n", tup->ob_refcnt);
    Py_DECREF(tup);
}

但是当我减少元组引用计数时,最后一行会导致分段错误。我不明白为什么会这样。在致电Py_DECREF之前,引用计数为1,那么这里的问题是什么?

1 个答案:

答案 0 :(得分:2)

在main的开头添加对Py_Initialize();的调用,然后重试。