无论何时对象的引用被传入函数或从函数传出,它是函数接口规范的一部分,无论拥有关系是被随引用转移与否。
大多数返回对象引用的函数传递一个所有关系的引用。 特别地,所有创建新对象的函速,如:PyInt_FromLong() 和 Py_BuildValue(),传递所有关系给接收者。 即使对象实际不是新建的,你还是接受对象新引用的所有关系, 例如,PyInt_FromLong()维护一个常用值的缓冲,并返回一个缓冲条目的引用。
许多从其他对象提取对象的函数也转移引用的所有关系, 如函数PyObject_GetAttrString()。这里描述不大清楚,然而, 由于一些新的公共例程是例外: PyTuple_GetItem(), PyList_GetItem(), PyDict_GetItem(),和PyDict_GetItemString()都返回你 从元组,列表,字典的借用引用。
函数PyImport_AddModule()也返回借用引用, 即使它也许实际创建了它的返回对象:这可能是因为对象的拥有引用被存储在sys.modules
中。
当你传递对象的引用给另一个函数,一般,函数从你这里借用引用-如果它需要存储它,它使用Py_DECREF(x)转变成独立的拥有者。但这个规则确有两个例外:PyTuple_SetItem()和PyList_SetItem()。这些函数接管传递给它们条目的所有关系-即使它们失败(注意PyDict_SetItem()和不接管所有关系,它们是正常的)。
当C函数被从Python调用时,是从调用者的参数借用引用。调用者拥有对象的引用,所以,直到函数返回,借用引用的生命周期是有保证的。只当借用引用必须被保存或传递时,他必须通过调用Py_INCREF()转成拥有引用。
从Python调用的C函数返回的对象引用必须是拥有引用-所有关系被从函数转移到调用者。