使用PyDict_SetItemString进行引用计数

2024-07-03 07:59:53 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

myPyDict = PyDict_New();
tempPyObj = PyString_FromString("Original Value");
PyDict_SetItemString(myPyDict,"fieldname",tempPyObj);
Py_DECREF(tempPyObj);

从内存和引用计数的角度来看,如果

^{pr2}$

原始值的参考计数是否自动递减(内存自动释放)?在

PyList_SetItem的文档特别提到了列表的情况:This function “steals” a reference to item and discards a reference to an item already in the list at the affected position.

但是PyDic_SetItem和{}都没有说明字典如何处理替换。在


Tags: theto内存new字典方式item计数
1条回答
网友
1楼 · 发布于 2024-07-03 07:59:53

旧值的ref计数由PyList_SetItem函数的逻辑自动递减。 你不应该一个人减少旧的价值。在

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

1)第PyDict_SetItemString()

https://github.com/python/cpython/blob/c8e7c5a/Objects/dictobject.c#L3250-L3262

它是一个薄薄的包裹物PyDict_SetItem()

2)第PyDict_SetItem()

https://github.com/python/cpython/blob/c8e7c5a/Objects/dictobject.c#L1537-L1565

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

3)第insertdict()

https://github.com/python/cpython/blob/c8e7c5a/Objects/dictobject.c#L1097-L1186

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

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

它减少旧值的ref计数。在

相关问题 更多 >