Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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解释器如何处理对象的负引用计数?_Python_Python C Api - Fatal编程技术网

python解释器如何处理对象的负引用计数?

python解释器如何处理对象的负引用计数?,python,python-c-api,Python,Python C Api,若对象的引用计数为负数,python解释器会释放该对象的内存吗 例如,如果我有这样的代码,time\u tuple会被python释放吗 PyObject* list = PyList_New(2); PyObject *time_tuple = Py_BuildValue("(s, s)", "Time", "O"); PyList_SetItem(list, 0, time_tuple); Py_XDECREF(time_tuple); Py_XDECREF(list); 如果可以的话,请

若对象的引用计数为负数,python解释器会释放该对象的内存吗

例如,如果我有这样的代码,
time\u tuple
会被python释放吗

PyObject* list = PyList_New(2);
PyObject *time_tuple = Py_BuildValue("(s, s)", "Time", "O");
PyList_SetItem(list, 0, time_tuple);
Py_XDECREF(time_tuple);
Py_XDECREF(list);

如果可以的话,请参考答案中的一些文档。

口译员永远不会遇到负引用计数。如果引用计数为零,则表示该对象的引用为零。一旦发生这种情况,对象将被释放

引用Python:

如果引用计数达到零,则调用对象类型的释放函数(该函数不得为NULL)

有关更多信息,请参见

还需要注意的是,在Python中,除了引用计数之外,还需要跟踪谁实际拥有这些引用

在您提供的示例中:

  • Py\u BuildValue()
    返回一个新的引用,该引用随后归您所有并保存在
    time\u元组中。此时,元组的引用计数为1

  • PyList\u SetItem()
    窃取所有权引用,元组的引用计数仍然为1,但该引用归
    list
    所有

  • Py\u XDECREF(time\u tuple)
    将元组的引用计数递减为0,对象被释放。这是一个错误,因为引用属于
    列表

  • Py_XDECREF(list)
    将列表的引用计数递减为0,列表被释放。对元组的引用归列表所有,因此它会减少其引用计数

  • 不幸的是,元组已经被分配,程序崩溃。或者更糟糕的是,它可能会继续运行一段时间,导致代码中不相关的部分崩溃。调试这通常很有趣


  • 我理解python引用拥有行为,这就是我编写该示例的原因。有趣的是,我的程序工作正常,没有任何崩溃,我认为负引用计数处理为0引用计数。