如何使用PyDict_SetDefault关于默认的refence计数

时间:2017-01-13 01:55:11

标签: python dictionary python-c-api

我想知道如何在不创建引用计数灾难的情况下使用PyDict_SetDefault

文档没有说明被盗参考资料,有些测试表明它没有窃取参考文献" gpg2 --gen-key。但是,只有当密钥没有出现在字典中时,它才会增加

这对我来说似乎很复杂,因为它太容易出错了。我目前正在使用它:

default

最后,字典和我拥有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?是真的那么复杂还是我错过了明显而简单的方式?

1 个答案:

答案 0 :(得分:1)

item = PyDict_SetDefault(dictionary, key, defaultvalue);
Py_INCREF(item);
Py_DECREF(defaultvalue);

item==defaultvalue是否真的无关紧要 - 无论发生什么事,你都拥有item的所有权(通过增加它)并释放defaultvalue的所有权(通过减少它,假设你没有'我想把它用于其他任何事情。)

如果字典中存在key,则不使用defaultvalue,因此其引用计数保持为1,并且会因为减压而被销毁。引用item时引用的引用数为1(因为它存储在字典中),我们将其递增,因为我们也使用它,因此item现在的引用数为2。

如果key不存在,那么defaultvalue将存储在字典中(现在引用refcount 2)并使用并返回。 itemdefaultvalue是相同的。我们递增item(引用3)递减defaultvalue(refcount 2)。

无论哪种方式,我们都会在同一个地方结束。