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

时间:2017-06-07 17:51:35

标签: cpython

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

  1. 如果有人可以解释为什么PyDict_SetItem不接受传入值的所有权,而PyList_SetItem和PyTuple_SetItem呢?以下是CPython文档中注意到这种差异的段落:
  2.   

    将对象引用传递给另一个函数时,通常,   函数借用你的参考 - 如果它需要存储它,   它将使用Py_INCREF()成为独立所有者。有   这条规则恰好有两个重要的例外:PyTuple_SetItem()和   PyList_SetItem()。这些功能接管项目的所有权   传递给他们 - 即使他们失败了! (注意PyDict_SetItem()和   朋友不接管所有权 - 他们是“正常的”。)

    这在某种程度上是合乎逻辑的(这会使内化和记忆变得更容易)还是它很大程度上只是一个很久以前制定的设计决策的随机历史文物?

    1. 另外,为了确保我理解 - PyDict_SetItem“不接受引用所有权的声明”意味着它在我内部传入的值上调用Py_INCREF,对吧? ie-在大多数情况下,我需要在调用PyDict_SetItem之后立即调用Py_DECREF值(就像在这个stackoverflow问题的代码中所做的那样:Reference counting using PyDict_SetItemString)? 谢谢。

0 个答案:

没有答案