Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 减少';调用PyArray_数据后正在初始化_Python_C_Numpy - Fatal编程技术网

Python 减少';调用PyArray_数据后正在初始化

Python 减少';调用PyArray_数据后正在初始化,python,c,numpy,Python,C,Numpy,我正在用C编写一个Python扩展。我的函数将Numpy数组(包含整数)的列表作为参数。我遍历列表,得到每个数组,增加引用,得到指向数组的C指针,然后减少引用 if (!PyArg_ParseTuple(args, "O", &list)) return NULL; long nb_arrays = PyList_Size(list); arrays = (int **) malloc(nb_arrays * sizeof(int *)); for (i = 0; i &l

我正在用C编写一个Python扩展。我的函数将Numpy数组(包含整数)的列表作为参数。我遍历列表,得到每个数组,增加引用,得到指向数组的C指针,然后减少引用

if (!PyArg_ParseTuple(args, "O", &list))
    return NULL;

long nb_arrays = PyList_Size(list);

arrays = (int **) malloc(nb_arrays * sizeof(int *));

for (i = 0; i < nb_arrays; i++)
{
    PyArrayObject *array = (PyArrayObject *) PyList_GetItem(list, i);
    Py_INCREF(array);

    arrays[i] = (int *) PyArray_DATA(array);

    Py_DECREF(array);
}
if(!PyArg_ParseTuple(args,“O”和列表))
返回NULL;
长nb_阵列=PyList_大小(列表);
数组=(int**)malloc(nb_数组*sizeof(int*);
对于(i=0;i

在这个循环之后,我使用指针进行计算。是正确的还是必须等待函数结束以减少引用计数?

PyArray\u DATA
对其应用到的数组的引用计数没有影响。此外,创建传递给函数的列表时,其中每个数组的引用计数都增加了一个。因此,虽然它们不会造成太大的伤害,但是那些
Py_incremf
Py_DECREF
完全没有必要,您可以将它们都去掉

当您要将对象传递给窃取引用的函数时,通常必须
Py_INCREF
对象(即,获取该对象的所有权,并承担在需要该对象时减少计数的责任)

通常,您必须
Py_DECREF
在函数中创建的任何临时对象,这些临时对象不是您的返回的一部分,并且任何返回都不需要


你很少(如果有的话)必须先
Py\u INCREF
一些东西,然后
Py\u DECREF
它。您可能会编写一些混乱的多线程代码来释放GIL,从而使此parragraph不正确,但一般来说,传递给函数的所有内容都是元组(如果是位置参数)或字典(如果是关键字参数)的一部分,因此在进行调用时,它的引用计数会增加。在函数返回之前,元组和字典不会被销毁,因此可以安全地假设传递给您的所有项不会在函数的中途被垃圾收集,即您正在借用该引用,因此,不需要仅仅为了访问对象而显式增加引用计数。

您的代码有问题。首先,实际上并没有检查列表中的每个项目是否真的是一个数组。你需要处理这种可能性。使用。其次,您借用了对数组中数据的引用。如果对数组中数据的引用在函数调用后仍然存在,则可能存在内存泄漏。关于参数检查,您是对的,我还没有这样做,以便集中精力处理内存。关于对数据的引用,Jaime(见下文)说PyArray_数据对引用计数没有影响。关于第二点,如果在函数结束之前释放
arrays
,那么一切都正常。但是,如果将
数组
保存到某个位置,然后如果其中一个数组的引用降至零,则
数组
将留下一个指向不再存在的数组的指针。当然,我在函数末尾释放了
数组
,因为我自己分配了它。但是我没有修改原来的Numpy数组。谢谢你有趣的解释。我对上面给出的关于引用计数的示例感到困惑(现在仍然如此)。它们确实调用Py_INCREF,然后调用Py_DECREF,而实际上并不修改传递的项。对此的解释对我来说似乎很不清楚,因为他们调用了一个可能的销毁项目0,而只有项目1被删除。是的,我可以想象这一部分是混乱的。。。您的代码不属于上面列出的两个示例中的任何一个,因此在您的情况下,删除这些调用是安全的。