gpt4 book ai didi

python - 在 Python C 扩展中处理 PyList_Append 时在 Py_DECREF/INCREF 上丢失

转载 作者:行者123 更新时间:2023-11-28 21:27:31 39 4
gpt4 key购买 nike

在处理 PyList_Append 时,我在 Py_DECREF/INCREF 上迷路了。任何人都可以对以下代码发表评论吗?

PyObject * bugmaybe(PyObject *self, PyObject *args)
{
PyObject * trio=PyList_New(0);
PyObject * trio_tmp;
PyObject * otmp = PyFloat_FromDouble(1.2);
PyList_Append(trio_tmp,otmp);
//Py_DECREF(otmp);
otmp = PyFloat_FromDouble(2.3);
PyList_Append(trio_tmp,otmp);
//Py_DECREF(otmp);
PyList_Append(trio,trio_tmp);
Py_INCREF(trio_tmp);
}

最佳答案

如果您预先知道列表的大小,通常可以更快地创建大小合适的列表并使用 PyList_SetItem()

您的代码完全错误,trio_tmp未初始化。

试试这个:

PyObject * bugmaybe(PyObject *self, PyObject *args)
{
PyObject * trio=PyList_New(3);
PyObject * otmp = PyFloat_FromDouble(1.2);
PyList_SetItem(trio,0,otmp);
otmp = PyFloat_FromDouble(2.3);
PyList_SetItem(trio,1,otmp);
PyList_Append(trio,2, PyList_New(0));
return trio;
}

如果您真的想使用 PyList_Append,您的代码基本上没问题,只是缺少 trio_tmp 的初始化和末尾多余的 Py_INCREF。

PyObject * bugmaybe(PyObject *self, PyObject *args)
{
PyObject * trio=PyList_New(0);
// trio has refcount 1
PyObject * trio_tmp = PyList_New(0);
// trio_tmp has recount 1
PyObject * otmp = PyFloat_FromDouble(1.2);
// otmp has recount 1
PyList_Append(trio_tmp,otmp);
// Append does not steal a reference, so otmp refcoun = 2
Py_DECREF(otmp);
// otmp refcount = 1, but stored in the list so the pointer var
// can be reused
otmp = PyFloat_FromDouble(2.3);
PyList_Append(trio_tmp,otmp);
Py_DECREF(otmp);
// as above
PyList_Append(trio,trio_tmp);
// decrement refcount for trio_tmp, as it has recount 2 now.
Py_DECREF(trio_tmp);
return trio;
}

上面的代码相当于:

 trio = []
trio_tmp = []
otmp = 1.2
trio_tmp.append(otmp)
otmp = 2.3
trio_tmp.append(otmp)
trio.append(trio_tmp)

希望对您有所帮助。主要提示在文档中,如果它说'Steals a reference'那么该函数基本上拥有所有权,如果它说'New Reference'然后它为你做了一个INCREF,如果没有说它可能会做一个INCREF和DECREF对根据需要。

关于python - 在 Python C 扩展中处理 PyList_Append 时在 Py_DECREF/INCREF 上丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10863669/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com