Python 使用PyDict_SetItemString的引用计数
我想知道当一个新值被设置到PyDict(在C扩展中)中的一个现有字段中时,内存管理/引用计数是如何工作的 例如,假设以以下方式创建和填充字典: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); 从内存和引用计数的角度来看,当出现后续事件时会发生
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) */
它减少了旧值的引用计数。奇怪的是,的文档没有明确指出它窃取了引用。的文档明确地指出了这一点。