旧值的引用计数根据以下逻辑自动递减PyList_SetItem
功能。
您不应该自己减少旧值。
如果你想了解细节,请查看 CPython 源代码,特别是Objects/dictobject.c
file.
1) The PyDict_SetItemString()
https://github.com/python/cpython/blob/c8e7c5a/Objects/dictobject.c#L3250-L3262 https://github.com/python/cpython/blob/c8e7c5a/Objects/dictobject.c#L3250-L3262
它周围有一层薄薄的包装纸PyDict_SetItem()
2) The PyDict_SetItem()
https://github.com/python/cpython/blob/c8e7c5a/Objects/dictobject.c#L1537-L1565 https://github.com/python/cpython/blob/c8e7c5a/Objects/dictobject.c#L1537-L1565
仍然非常简单,而且很明显,与在字典中插入/替换值相关的所有繁重工作实际上都是由insertdict()
.
3) The insertdict()
https://github.com/python/cpython/blob/c8e7c5a/Objects/dictobject.c#L1097-L1186 https://github.com/python/cpython/blob/c8e7c5a/Objects/dictobject.c#L1097-L1186
是给我们答案的函数。在此函数中,您可以找到关键代码,尤其是调用:
Py_XDECREF(old_value); /* which **CAN** re-enter (see issue #22653) */
这会减少旧值的引用计数。