Cpython PyDict_SetItem与PyList_SetItem或PyTuple_SetItem之间所有权规则的差异?

Cpython PyDict_SetItem与PyList_SetItem或PyTuple_SetItem之间所有权规则的差异?,cpython,Cpython,关于使用Python中的函数(如PyDict_SetItem和PyList_SetItem)的所有权规则和引用计数的两个问题: 如果有人能解释为什么PyDict_SetItem不拥有传入值的所有权,而PyList_SetItem和PyTuple_SetItem拥有传入值的所有权,我将不胜感激?以下是CPython docs的一段话,它指出了这一差异: 通常,当您将对象引用传递给另一个函数时, 函数从您那里借用引用-如果需要存储它, 它将使用Py_INCREF()成为独立所有者。有 这条规则有两个

关于使用Python中的函数(如PyDict_SetItem和PyList_SetItem)的所有权规则和引用计数的两个问题:

  • 如果有人能解释为什么PyDict_SetItem不拥有传入值的所有权,而PyList_SetItem和PyTuple_SetItem拥有传入值的所有权,我将不胜感激?以下是CPython docs的一段话,它指出了这一差异:
  • 通常,当您将对象引用传递给另一个函数时, 函数从您那里借用引用-如果需要存储它, 它将使用Py_INCREF()成为独立所有者。有 这条规则有两个重要的例外:PyTuple_SetItem()和 PyList_SetItem()。这些功能接管项目的所有权 传递给他们-即使他们失败!(请注意,PyDict_SetItem()和 朋友不会接管所有权——他们是“正常的”。)

    这在某种程度上是合乎逻辑的(这会使它更容易内在化和记忆),还是仅仅是很久以前设计决策的随机历史产物

  • 另外,为了确保我理解,PyDict_SetItem“不获取引用的所有权”的语句意味着它对我在内部传递的值调用Py_INCREF,对吗?ie-在大多数情况下,我需要在调用PyDict_SetItem后立即调用Py_DECREF值(就像在这个stackoverflow问题的代码中所做的那样:)? 谢谢