0

嗨:这是对这个问题的跟进:

如何将所有python实例复制到一个新类?

问题是deepcopy()没有正确复制对象,这可以通过这个工作代码看出:

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout

class MyApp(App):
    def build(self):
        global Myroot    
        self.root = FloatLayout()
        Myroot = self.root
        Starthere(None)

        return

class VarStorage:
    pass

VS=VarStorage()
from kivy.uix.button import Button
import copy

def Starthere(instance):
    VS.MyButton=Button()
    print str(VS.MyButton)
    VSCopy=copy.deepcopy(VS)
    print str(VSCopy.MyButton)

MyApp().run()

根据我对副本的理解,它应该打印两次相同的按钮,但结果是:

<kivy.uix.button.Button object at 0x046C2CE0>
<kivy.uix.button.Button object at 0x04745500>

如何deepcopy()复制相同的对象而不是新的(不存在的)对象?谢谢!

- - - - - - - - - - - 编辑 - - - - - - - - - - - - - - --

在尝试copy()而不是之后deepcopy(),这不是我打算做的:

我得到了什么deepcopy()

  • VS 的复制类,为非对象复制项目(例如,如果 VS.text="text",则 VSCopy.text 将具有相同的内容而不会被链接)。
  • 但是,对于对象,我需要的是对此类对象的引用的副本,但我没有得到,因为我得到了一个新的引用点和一个新的对象。

我得到了什么copy()

  • 复制的类 VSCopy 与指向原始类 VS 的引用。我不想要这个,因为我想更改 VS 的内容(这就是我试图复制它的原因)并且仍然在 VSCopy 中提供原始内容。

复制模块中是否有这样的功能?

4

3 回答 3

3

您需要使用shallowcopy而不是deepcopy. 从复制模块文档:

  • 浅拷贝构造一个新的复合对象,然后(尽可能)将引用插入到原始对象中。
  • 深拷贝构造一个新的复合对象,然后递归地将在原始对象中找到的对象的副本插入其中。

您可以使用copy.copy()创建浅拷贝

VSCopy = copy.copy(VS)
于 2013-07-21T13:56:30.930 回答
2

复制模块中是否有这样的功能?

不,恐怕没有。

听起来您想要某种混合的深/浅行为,而这不是copy模块中存在的。你要么得到一个浅拷贝,要么得到一个深拷贝。

关于这些坏消息我很遗憾。:) 您可能只想编写自己的复印机,或者看看您是否可以在不复印的情况下完成任务

(我看到您编辑了您的问题,所以我再次回答,看看我是否可以提供帮助。(请参阅我的第一个答案以回复您原来的 Q。))

于 2013-07-21T15:50:04.707 回答
1

deepcopy正在按预期工作(假设 VarStorages 可以被深度复制)。您可能会对 Button 的字符串表示感到困惑。

当你对一个对象进行深度复制时,它(根据定义)将有一个新的内存地址。

这:

<kivy.uix.button.Button object at 0x046C2CE0>

表示在内存位置 0x046C2CE0 有一个 Button 对象。

还有这个:

<kivy.uix.button.Button object at 0x04745500>

意味着在内存位置 0x04745500 处有一个不同的 Button 对象。这正是您想要的(对吗?)——第一个按钮的副本。

也许(尽管我不这么认为)您实际上想要一个浅拷贝(copy.copy)?

于 2013-07-21T13:58:30.360 回答