Python到C和垃圾收集器
Python中有以下问题(C中变量by ref或val的问题) 我的C代码:Python到C和垃圾收集器,python,garbage-collection,ctype,Python,Garbage Collection,Ctype,Python中有以下问题(C中变量by ref或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 iSiz
#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;
}
当我使用标量函数时,myObject的状态等于已分配
然而,当我进入另一个函数时,我看到object List的状态现在是NON_ALLOCATED,因为python垃圾收集器由于Scalar(mylist[I])是一个称为
您能帮我重写这段python代码吗?这样python就不会调用列表[i]上的垃圾收集器了?
谢谢到目前为止,我仍然不认为您发布的代码存在垃圾收集问题。但是您的Python代码还有其他重要的问题。(FWIW,C代码看起来不错,我想您已经使用C有一段时间了,但对Python来说还是相当陌生的)。最大的问题是MyClass的定义有缺陷。您还没有向我们展示创建MyClass实例的代码以及如何使用它,因此可能还有其他问题
当调用一个类方法时,它会将类实例作为第一个参数传递,通常称为self
。此参数未在调用方法时提供的参数中指定,但必须在方法定义中指定
例如
输出
5
因此,add()
方法是用三个参数定义的,但是当我们调用它时,我们只显式地提供两个参数,因为第一个参数,self
,是隐式的
除了您的\uu del_u
方法外,您的大多数方法定义没有将self
作为其第一个参数。Python不在乎参数的名称,它会将self
插入方法定义中的第一个参数中。因此,您所有的方法(除了\uuu del\uu
)都被错误的参数调用
另外,当您在该类的另一个方法中调用一个方法时,您需要指出这一点,通常是通过在该方法的名称前面加上self.
。乙二醇
def transformValue(self, mylist):
#The rest of the method definition
#...
def myFunc(self, mylist):
listValue = self.transformValue(mylist)
return anotherCFunction(listValue)
我不明白
MyFunc()
应该做什么。为什么您向我们展示了TransformValue()
的定义,而不是TransformMacsValue()
的定义?什么是c功能
?顺便说一句,在Python中,简单变量和函数的名称通常保持小写;大写的名称用于类。我已经编辑了我的代码(很抱歉输入错误),我看到Python在封装这些函数的类中调用了析构函数(标量上的垃圾(列表[I])因为他认为它是局部变量,所以您向我们展示的代码不应该存在垃圾收集问题?double的选项卡是什么意思?感谢您修复了变量和函数名的大小写,但现在出现了一个新问题:使用列表作为变量名会影响内置的列表()
,因为普通变量和函数共享相同的名称空间。再次抱歉,我试图使测试用例更复杂,以解释我的问题抱歉,当我试图简化Python代码时,这是一个错误。这些函数没有嵌入到我的类中,感谢您的帮助clarification@parisjohn:啊!这就解释了为什么Python没有com我想你应该修复代码的缩进,这样就可以清楚地知道那些函数不应该是MyClass的一部分。请向我们展示您在何处创建MyClass实例的代码以及如何使用它,以便我们能够找到问题的真正原因。非常感谢您的帮助,但我的代码更复杂,目前我还没有成功地拥有一个简单的复制器
5
def transformValue(self, mylist):
#The rest of the method definition
#...
def myFunc(self, mylist):
listValue = self.transformValue(mylist)
return anotherCFunction(listValue)