- cpython/
- Cpython PyDict_SetItem与PyList_SetItem或PyTuple_SetItem之间所有权规则的差异?
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问题的代码中所做的那样:)?
谢谢李>