什么是C ++中“new”的python等价物

时间:2013-08-05 18:04:13

标签: python python-2.7

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

我的方法有问题,它填写了一个新的数据结构并将其附加到列表中。它被设置为一个协程,它使用(yield)函数中的数据填充临时结构。完成后,它会将数据附加到列表中(例如self.list.append(newdata))。我的问题是这个追加是通过引用发生的,我无法弄清楚如何将newdata初始化为新的memoryspace。发生了什么事情我有一个数据列表都指向相同的数据结构(例如“myclass.list [n]是myclass.list [m]”总是产生TRUE)。谁能告诉我如何使这项工作?

如果我用C ++编写,我只需要做“newdata = new * mydatastructure;”在每次循环迭代之后...我只是无法弄清楚如何在python中做到这一点....我离开了吗?

2 个答案:

答案 0 :(得分:2)

  

我的问题是这个追加是通过引用发生的,我无法弄清楚如何将newdata初始化为新的memoryspace。

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

>>> # 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中的分配/构造函数更感兴趣,请参阅另一个答案。

答案 1 :(得分:1)

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

Python为您解决了这个问题。从技术上讲,Python中有一个类似的例程,名为__new__,它控制着分配。但是,您很少需要在对象上覆盖它。

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

不幸的是,你的问题出现在代码的其他地方。

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