PyList_GetItem не идемпотент

Я пробую Swig и имею следующий код C и интерфейс соответственно:

// example.c
#include <Python/Python.h>
PyObject *test ( PyObject *self, int i) {
    PyObject **x;
    x = malloc(sizeof(PyObject *));
    *x = PyList_GetItem(self, i);
    return *x;
}

// example.i
%module example
%{
/* Put header files here or function declarations like below */
extern PyObject* test(PyObject *self, int i);
%}

extern PyObject* test(PyObject *self, int i);

Он компилируется правильно, и я могу нормально импортировать модуль расширения. Фактически, когда я определяю переменную a как [{1:1},{2:2}] и выполняю example.test(a, 0) в первый раз, она правильно возвращает {1,1}. Когда я вхожу в оболочку Python, я получаю [{1:1},{2:2}], как и ожидалось. Когда я снова пытаюсь попробовать example.test(a, 0), я получаю ошибку сегментации. Есть идеи, почему это происходит?

1 ответ

Решение

PyObject* PyList_GetItem(список PyObject *, индекс Py_ssize_t)
Возвращаемое значение: Заимствованная ссылка.

Увеличьте объект, прежде чем вернуть его.

Другие вопросы по тегам