我正在尝试创建一个类来填充结构化数据项列表以及一些用于从文件和 IO 设备填充列表的方法。
我在填充新数据结构并将其附加到列表的方法中遇到问题。它被设置为一个协程,用来自 (yield) 函数的数据填充一个临时结构。完成后,它会将数据附加到列表中(例如 self.list.append(newdata))。我的问题是这个追加是通过引用发生的,我不知道如何将新数据初始化到新的内存空间。最后发生的事情是我有一个数据列表都指向相同的数据结构(例如“myclass.list[n] is myclass.list[m]”总是产生 TRUE)。谁能告诉我如何进行这项工作?
如果我用 C++ 编写,我只需要执行“newdata = new * mydatastructure;”在每次循环迭代后...我只是不知道如何在 python 中执行此操作...我是不是偏离了轨道?
最佳答案
new
是 mydatastructure* = malloc(sizeof(mydatastructure));
的语法糖(或类似的东西,已经有一段时间了)。它会在堆上为您所拥有的分配适当数量的内存,如果您使用构造函数(在 C++ 中),它会初始化内存。
Python 会为您处理这件事。从技术上讲,Python 中有一个类似的例程,称为 __new__
,它控制分配。但是,您很少需要在您的对象上重写它。
Python 对象的构造函数称为 __init__
。当您调用 __init__
时,实际上首先调用了 __new__
。所以,当你在 Python 中构造对象时,你会自动为它们分配新的内存,而且每个内存都是不同的。正如本杰明所指出的,构造函数语法 (foo = Foo()
) 是您调用 __init__
而无需实际键入 __init__()
的方式。
不幸的是,您的问题出在代码的其他地方。
顺便说一句,如果你真的想确定两个变量引用同一个对象,你可以使用id()
函数来获取引用号。 is
关键字比较这些引用数字,与 ==
运算符相反,后者使用对象的 __eq__
方法来比较它们。
关于python - 什么是 C++ 中 "new"的 python 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18064707/