释放 PyTuple 对象

3 投票
1 回答
1326 浏览
提问于 2025-04-16 11:13

如何正确地释放一个 PyTuple 对象,使用 Python 的 C-API 呢?

我知道元组在引用计数方面有点特别,因为 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 个回答

3

在主函数的开头加上 Py_Initialize(); 这一行,然后再试一次。

撰写回答