Python到C和垃圾收集器

时间:2014-12-02 10:28:29

标签: python garbage-collection ctype

我在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]上调用垃圾收集器? 感谢

1 个答案:

答案 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)