Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.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 使用PyDict_SetItemString的引用计数_Python_Python 2.7 - Fatal编程技术网

Python 使用PyDict_SetItemString的引用计数

Python 使用PyDict_SetItemString的引用计数,python,python-2.7,Python,Python 2.7,我想知道当一个新值被设置到PyDict(在C扩展中)中的一个现有字段中时,内存管理/引用计数是如何工作的 例如,假设以以下方式创建和填充字典: myPyDict = PyDict_New(); tempPyObj = PyString_FromString("Original Value"); PyDict_SetItemString(myPyDict,"fieldname",tempPyObj); Py_DECREF(tempPyObj); 从内存和引用计数的角度来看,当出现后续事件时会发生

我想知道当一个新值被设置到PyDict(在C扩展中)中的一个现有字段中时,内存管理/引用计数是如何工作的

例如,假设以以下方式创建和填充字典:

myPyDict = PyDict_New();
tempPyObj = PyString_FromString("Original Value");
PyDict_SetItemString(myPyDict,"fieldname",tempPyObj);
Py_DECREF(tempPyObj);
从内存和引用计数的角度来看,当出现后续事件时会发生什么

tempPyObj = PyString_FromString("New Value");
PyDict_SetItemString(myPyDict,"fieldname",tempPyObj);
Py_DECREF(tempPyObj);
原始值的参考计数是否自动递减(内存是否自动释放)

PyList_SetItem
的文档特别提到列表发生的情况:
此函数“窃取”对项目的引用,并放弃对列表中受影响位置的项目的引用。


但是无论是
PyDic\u SetItem
还是
PyDict\u SetItemString
都没有说明字典的替换是如何处理的。

PyList\u SetItem函数的逻辑会自动减少旧值的引用计数。 你不应该自己递减旧值

如果您想了解详细信息,请查看CPython源代码,特别是
Objects/dictobject.c
文件

1)PyDict\u SetItemString()

它是
PyDict\u SetItem()的薄薄包装

2)PyDict_SetItem()

仍然非常简单,很明显,所有与插入/替换dict中的值相关的繁重工作实际上都是由
insertdict()完成的

3)插入dict()

是给我们答案的函数。在此函数中,您可以找到关键代码,尤其是调用:

 Py_XDECREF(old_value); /* which **CAN** re-enter (see issue #22653) */

它减少了旧值的引用计数。

奇怪的是,的文档没有明确指出它窃取了引用。的文档明确地指出了这一点。