C++中 Python 相当于 "new" 是什么



我正试图创建一个类来填充结构化数据项的列表,以及一些从文件和IO设备填充列表的方法。

我的方法有一个问题,它填充了一个新的数据结构并将其附加到列表中。它被设置为一个协程,用(yield)函数中的数据填充临时结构。完成后,它会将数据附加到列表中(例如self.list.append(newdata))。我的问题是,这种附加是通过引用进行的,我不知道如何将newdata初始化到新的内存空间。最终发生的是,我有一个数据列表,所有数据都指向同一个数据结构(例如,"myclass.list[n]是myclass.list[m]"总是产生TRUE)。有人能告诉我怎么做吗?

如果我是用C++编写的,我只需要在每次循环迭代后执行"newdata=new*mydatastructure;"。。。我只是不知道如何在python中做到这一点。。。。我是不是偏离了路线?

newmydatastructure* = malloc(sizeof(mydatastructure));的语法糖(或者类似的东西,已经有一段时间了)。它在堆上为您所拥有的分配适当数量的内存,如果您使用构造函数(在C++中),它会初始化内存。

Python会为您处理这些问题。从技术上讲,Python中有一个类似的例程,称为__new__,用于控制分配。但是,您很少需要在对象上覆盖此项。

Python对象的构造函数称为__init__。当您调用__init__时,实际上首先调用的是__new__。因此,当您在Python中构造对象时,您会自动为它们分配新的内存,并且每一个都是不同的。正如Benjamin所指出的,构造函数语法(foo = Foo())是在不实际键入__init__()的情况下调用__init__的方式。

不幸的是,您的问题在代码的其他地方。

顺便说一句,如果你真的想确保两个变量引用同一个对象,你可以使用id()函数来获得引用号。is关键字比较这些参考数字,而==运算符使用对象的__eq__方法进行比较。

我的问题是,这个附加是通过引用发生的,我不知道如何将新数据初始化到新的内存空间。

如果您试图按值将对象附加到列表中,则可能需要使用copy.copy或copy.depcopy之类的方法来确保所附加的内容被复制。

>>> # The Problem
>>> class ComplexObject:
...     def __init__(self, herp, derp):
...         self.herp = herp
...         self.derp = derp
...
>>> obj = ComplexObject(1, 2)
>>> list = []
>>> list.append(obj)
>>> obj.derp = 5
>>> list[0].derp
5
>>> # obj and list[0] are the same thing in memory
>>> obj
<__main__.ComplexObject instance at 0x0000000002243D48>
>>> list[0]
<__main__.ComplexObject instance at 0x0000000002243D48>
>>> # The solution
>>> from copy import deepcopy
>>> list = []
>>> obj = ComplexObject(1,2)
>>> list.append(deepcopy(obj))
>>> obj.derp = 5
>>> list[0].derp
2
>>> obj
<__main__.ComplexObject instance at 0x0000000002243D48>
>>> list[0]
<__main__.ComplexObject instance at 0x000000000224ED88>

这是我试图在没有看到任何代码的情况下,从你的描述中实际解决你的问题。如果您对Python中的分配/构造函数更感兴趣,请参阅另一个答案。

最新更新