我想知道如何使用 PyDict_SetDefault
不会造成引用计数灾难。
文档没有提及任何有关被盗引用的内容,并且一些测试表明它不会“窃取默认引用”。但当且仅当字典中不存在该键时,它才会递增它。
这对我来说真的很复杂,因为它太容易出错了。我目前这样使用它:
item = PyDict_SetDefault(dictionary, key, defaultvalue);
if (item != defaultvalue) {
/* key was present, the item is a borrowed reference and default is at refcount 1.*/
Py_INCREF(item); /* item at refcount 2 */
Py_DECREF(defaultvalue); /* default at refcount 0 */
defaultvalue= NULL;
} else {
/* key wasn't present, item is default and has refcount 2. */
defaultvalue = NULL;
}
最后,字典和我拥有的 item
和 default
的引用被彻底删除了,对吧?
是否有更好的方法来处理这种情况,而无需明确检查我是否错过了 item == default
?真的有那么复杂吗?还是我错过了明显且简单的方法?
最佳答案
item = PyDict_SetDefault(dictionary, key, defaultvalue);
Py_INCREF(item);
Py_DECREF(defaultvalue);
是否item==defaultvalue
并不重要 - 无论发生什么,你都会获得item
的所有权(通过增加它)并释放defaultvalue<的所有权
(通过 decrefing 它,假设您不想将其用于其他用途)。
如果字典中存在key
,则不使用defaultvalue
,因此它的引用计数保持在1,并且它会被decref销毁。 item
返回的引用计数为 1(因为它存储在字典中),我们增加它,因为我们也在使用它,所以 item
现在的引用计数为 2。
如果 key
不存在,则 defaultvalue
将存储在使用并返回的字典中(引用计数现在为 2)。 item
和 defaultvalue
是相同的。我们递增 item
(refcount 3) 并递减 defaultvalue
(refcount 2)。
无论哪种方式,我们都会在同一个地方结束。
关于python - 如何使用 Py Dict SetDefault 来获取默认值的引用计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41626220/