Python类型扩展w/Numpy数组引用计数行为

Python类型扩展w/Numpy数组引用计数行为,python,arrays,numpy,reference-counting,python-c-extension,Python,Arrays,Numpy,Reference Counting,Python C Extension,我正在为一种新的python类型编写一个C扩展。这个新类型的属性之一是一个Numpy数组,它来自传递到C扩展的外部数据。我这样定义属性数组: array = PyArray_SimpleNewFromData(numDims,shape,NPY_DOUBLE,[DATA POINTER]) >>>from myModule import myObj >>>import sys >>>base = myObj() >>>sy

我正在为一种新的python类型编写一个C扩展。这个新类型的属性之一是一个Numpy数组,它来自传递到C扩展的外部数据。我这样定义属性数组:

array = PyArray_SimpleNewFromData(numDims,shape,NPY_DOUBLE,[DATA POINTER])
>>>from myModule import myObj
>>>import sys
>>>base = myObj()
>>>sys.getrefcount(base)
2
>>>newArr = base.array
>>>sys.getrefcount(base)
2
>>>del newArr
>>>sys.getrefcount(base)
2
[DATA POINTER]是内存中外部数据的位置

然后,我使用此命令将数组属性的“base”设置为包含该属性的type对象:

PyArray_SetBaseObject((PyArrayObject*)array,(PyObject*)[PY_TYPE OBJECT])
现在,据我所知,在导入模块时,
object.array
的“类型”是
numpy.ndarray

当我使用普通数据阵列并执行以下命令时,我会看到后续的行为:

>>>import numpy as np
>>>import sys
>>>base = np.array([1,2,3,4,5])
>>>sys.getrefcount(base)
2
>>>newArr = base
>>>sys.getrefcount(base)
3
>>>del newArr
>>>sys.getrefcount(base)
2
我希望我的数组属性增加和减少其基的引用计数,就像
newArr
增加然后减少
base
的引用计数一样。但是,我的模块的行为如下:

array = PyArray_SimpleNewFromData(numDims,shape,NPY_DOUBLE,[DATA POINTER])
>>>from myModule import myObj
>>>import sys
>>>base = myObj()
>>>sys.getrefcount(base)
2
>>>newArr = base.array
>>>sys.getrefcount(base)
2
>>>del newArr
>>>sys.getrefcount(base)
2

有人知道如何使用我的
array
属性来更改基类型对象的引用计数吗?我最初的想法是使用这种粗鲁的行为,但我愿意接受评论和建议

如果
base.array
在访问它之前已经存在,则访问
base.array
不应创建对
base
的新引用。为什么会这样?请注意,
PyArray\u SetBaseObject
窃取了一个引用
newArray=base.array
创建对
base.array
yes的新引用?然后我想创建一个对
base
的新引用,因为它是存储
base.array
中包含的信息的对象。被盗的引用是否无法完成此操作?是的,但您没有检查
base.array
的refcount。您正在检查
base
的引用计数。很抱歉,仍在计算堆栈溢出并在完成之前发布了我的评论
base。在访问
base之前,数组已经存在。数组
不应创建对
base
的新引用。为什么会这样?请注意,
PyArray\u SetBaseObject
窃取了一个引用
newArray=base.array
创建对
base.array
yes的新引用?然后我想创建一个对
base
的新引用,因为它是存储
base.array
中包含的信息的对象。被盗的引用是否无法完成此操作?是的,但您没有检查
base.array
的refcount。您正在检查
base
的refcount。很抱歉,仍然发现堆栈溢出,并在完成之前发布了我的评论