《扩展和嵌入python解释器》1.10.2 所有关系原则(Ownership Rules)

1.10.2 所有关系原则(Ownership Rules)

无论何时对象的引用被传入函数或从函数传出,它是函数接口规范的一部分,无论拥有关系是被随引用转移与否。

大多数返回对象引用的函数传递一个所有关系的引用。 特别地,所有创建新对象的函速,如: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函数返回的对象引用必须是拥有引用-所有关系被从函数转移到调用者。  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值