在 Python 的 C/C++ 扩展中,返回的 PyObject* 应该有多少引用计数?

Posted

技术标签:

【中文标题】在 Python 的 C/C++ 扩展中,返回的 PyObject* 应该有多少引用计数?【英文标题】:In C/C++ extensions to Python, what reference count should a returned PyObject* have? 【发布时间】:2016-06-02 21:19:38 【问题描述】:

假设您为 python 编写了一个 C++(或 C)扩展,称为 module。它返回一个数组数组。返回的数组及其数组的引用计数应该是什么?

python 代码类似于

import my_module
from sys import getrefcount as g      # will use to check reference count

def use_module():
   x = my_module.func()
   print 'x =', x
   print 'g(x) =', g(x)
   print 'g(x[0]) =', g(x[0])
   test = 'some random thing'
   print 'should be', g(test), '?'

use_module()
>>> x = ( (1,2,3,4) , [2,3] , 'one':1 )
>>> g(x) = 3
>>> g(x[0]) = 3
>>> should be 2 ?

我希望 g(x)2,而不是 3。 (在为g 添加一个以引用x 之后)

在我的 C++ 扩展中,我确保数组及其所有子集合及其元素在返回给 python 之前具有 1 的引用计数,所以我不确定它是如何上升到 @987654329 @ 这么快?也许返回的PyObject* 应该有0 作为它的引用计数?

编辑:对不起,我是个白痴。我在不知不觉中又做了一个参考。

【问题讨论】:

【参考方案1】:

如果不存在对返回对象的其他引用,则引用计数应为 1。如果引用计数为 0,则对象将被释放。

【讨论】:

为了更清楚,docs.python.org/3/c-api/intro.html#reference-count-details 准确地告诉了 refcount 的事情必须发生的时间,即。 e.它讲述了参考接收、借用、窃取等。

以上是关于在 Python 的 C/C++ 扩展中,返回的 PyObject* 应该有多少引用计数?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我无法打开/读取从 Python 调用的 C 扩展名中的 txt 文件?

初用C/C++扩展Python,提高性能

Cython 是用于构建 C 代码还是用于构建 Python 扩展?

在 C++ 中扩展嵌入式 Python - 设计与 C++ 实例交互

如何为不同的 OS/Python 版本编译 Python C/C++ 扩展?

扩展Python模块系列----开发环境配置