嗨:这是对这个问题的跟进:
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()
获得了什么:
我使用copy()
获得了什么:
复制模块中有这样的功能吗?
答案 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
)?