我在Python中遇到以下问题(ref中的变量或C中的val的问题)
我的C代码:
#define NON_ALLOCATED 0
#define ALLOCATED 1
#define MAX_STACK 100
typedef struct myObject
{
int iStatus;
int iSize;
double pdTab;
}
static myObject globaTab[MAX_STACK]
myObject *AllocateATab(int iSize)
{
myObject *pxTab = NULL;
int i;
int iFound = 0;
while(i < MAX_STACK && !iFound)
{
if (globaTab[i].iStatus = NON_ALLOCATED)
iFound = 1;
break;
}
if (i < MAX_STACK)
{
pxTab = globaTab + i;
pxTab->iStatus = ALLOCATED;
pxTab->pdTab = (double *)calloc(iSize, sizeof(double));
}
return pxTab;
}
int FreeATab(myObject *pxTab)
{
if (pxTab)
{
pxTab->iStatus = NON_ALLOCATED;
if (pxTab->pdTab)
free(pxTab->pdTab);
}
}
myObject *Scalar(double dValue)
{
myObject *pxTab = AllocateATab(1000)
for (int iSize = 0; iSize < 1000; iSize++)
pxTab->pdTab[iSize] = dValue;
return pxTab;
}
我的Python代码示例:
class MyClass(object):)
def __del__(self):
mylibC.FreeATab(self)
def Scalar(valueinput):
return mylibC.Scalar(valueinput)
def transformValue(mylist):
Len=len(mylist)
res = [0]*Len
for i in xrange(Len):
if(type(mylist[i]) == float):
res[i] = Scalar(mylist[i])
else:
res[i] = mylist[i]
return res
def myFunc(mylistlist):
listValue = transformValue(mylist)
return anotherCFunction(listValue)
当我使用标量函数时,myObject的状态等于Allocated 但是当我输入anotherCFunction时,我看到对象List的状态现在是NON_ALLOCATED,因为已经调用了python垃圾收集器,因为Scalar(mylist [i])是一个名为
的本地请你帮我改写这个python代码,以便Python不在List [i]上调用垃圾收集器? 感谢
答案 0 :(得分:1)
我仍然认为到目前为止您发布的代码存在垃圾回收问题。但是您的Python代码还存在其他重大问题。 (FWIW,C代码看起来没问题,我想你已经使用了C一段时间,但仍然是相当新的Python)。最大的问题是MyClass的定义有问题。您还没有向我们展示您创建MyClass实例以及如何使用它的代码,因此可能还有其他问题。
当调用类方法时,它会将类实例作为第一个参数传递,通常命名为self
。调用方法时给出的参数中未指定此参数,但必须在方法定义中指定。
例如,
class SimpleClass(object):
def add(self, x, y):
return x + y
simple = SimpleClass()
print simple.add_one(2, 3)
<强>输出强>
5
所以add()
方法是定义有三个args,但是当我们调用它时,我们只显式提供两个args,因为第一个arg self
是隐式的。
除了self
方法之外,大多数方法定义不都有__del__
作为第一个arg。 Python并不关心你为参数命名的内容,它会将self
推送到方法定义中的第一个参数中。因此,所有方法(除__del__
之外)都会被错误的args调用。
此外,当您在该类的另一个方法中调用方法时,您需要通过在self.
前加上方法的名称来指明该方法。例如
def transformValue(self, mylist):
#The rest of the method definition
#...
def myFunc(self, mylist):
listValue = self.transformValue(mylist)
return anotherCFunction(listValue)