python 中是否有任何方法,我可以使用它从堆中获取一块内存,并使用一个变量来引用它。就像关键字“new”,或者其他语言中的函数 malloc()
:
Object *obj = (Object *) malloc(sizeof(Object));
Object *obj = new Object();
在项目中,我的程序正在等待以不确定的间隔接收一些数据,并且正确时具有一定的字节长度。
我以前是这样的:
void receive()// callback
{
if(getSize()<=sizeof(DataStruct))
{
DataStruct *pData=malloc(sizeof(DataStruct));
if(recvData(pData)>0)
list_add(globalList,pData);
}
}
void worker()
{
init()
while(!isFinish)
{
dataProcess(globalList);
}
}
现在,我想将这些旧项目迁移到 python,我尝试这样做:
def reveive():
data=dataRecv()
globalList.append(data)
但是,我得到列表中的所有项目都是相同的,并且等于最新收到的项目。很明显,所有列表项都指向相同的内存地址,我想在每次调用函数时获得一个新的内存地址。
原文由 lb lb 发布,翻译遵循 CC BY-SA 4.0 许可协议
python 中“new”的等价物是只使用一个构造函数,例如:
由于您是从 C 移植的,因此需要注意一些事项。 python中的一切都是对象包括整数,大部分变量只是引用,但是整数和字符串等标量变量的规则与容器不同,例如:
然而:
如果你愿意,你可以预先分配大小,但它通常不会给你在 python 中带来太多好处。以下内容有效:
如果您想确保不会发生内存泄漏,请尽可能多地使用局部变量,例如,在一个函数内,这样您就不必担心事情超出范围。
对于高效的矢量化操作(以及更低的内存占用),请使用 numpy 数组。
我加了两分钱:我可能会先问您的主要目标是什么。有 pythonic 的做事方式,同时尝试优化程序执行速度或最小内存占用。然后是尝试在尽可能短的时间内移植程序。有时它们都相交,但更常见的是,您会发现 pythonic 方式可以快速翻译但内存要求更高。从 python 获得更高的性能可能需要专注的经验。祝你好运!