Python deepcopy更改对象的引用

时间:2013-07-21 13:53:44

标签: python button kivy deep-copy

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

How to copy all python instances to a new class?

问题是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将具有相同的内容 内容没有任何关联)。
  • 但是,对于对象,我需要的是对此类引用的副本 对象,我没有得到,因为我得到一个新的参考pointint 对象。

我使用copy()获得了什么:

  • 使用指向原始类VS的引用复制类VSCopy。一世 不要这样,因为我想改变VS的内容(这就是为什么我 试图复制它)仍然有原始的可用 VSCopy。

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

3 个答案:

答案 0 :(得分:3)

您需要使用shallowcopy代替deepcopy。来自copy module docs:

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

您可以使用copy.copy()创建浅色副本

VSCopy = copy.copy(VS)

答案 1 :(得分:2)

  

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

不,我担心没有。

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

抱歉这个坏消息。 :)您可能只想编写自己的复印机,或者看看是否可以完成任务而无需复制本身

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

答案 2 :(得分:1)

deepcopy正在按预期工作(假设VarStorage可以进行深度复制)。你可能会对Buttons的字符串表示感到困惑。

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

此:

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

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

而且:

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

表示在内存位置0x04745500处有一个不同的 Button对象。这正是你想要的(对吗?) - 第一个按钮的副本。

也许(虽然我不这么认为)你真的想要一个浅表副本(copy.copy)?