我试图了解一个观察结果。
我有一个应用程序,可以加载用户以后可以使用的各种Canvas
类。这些类位于多个文件中。
例如。
canvas/
bw.py
colored.py
oil.py
我导入,实例化和复制这些对象:
canvas_files = os.listdir('images')
imported_canvs = []
for canv in canvas_files:
canv = __import__(canv.split('.')[0], fromlist=['Canvas'])
try:
new_canv = canv.Canvas()
new_canv_copy = copy.copy(new_canv)
imported_canvs.append(new_canv_copy)
except AttributeError as ex:
pass
之后,用户使用Canvas
列表中的每个imported_canvs
对象。但是,当我导入并实例化这些对象两次(再次运行for
循环)时,我可以看到id(new_canv_copy)
与先前导入和实例化的对象相同。
这不会是一个问题,除非每个Canvas
具有对每个实例都应该是唯一的设置,并且这当前没有发生。每当用户更改一个Canvas
中的设置时,它们将在复制的设置中自动更改。
为什么会发生这种情况,我做错了什么?
答案 0 :(得分:1)
仅使用PdfSmartCopy
创建一个浅表副本。使用copy.deepcopy()
复制对象时,您可能希望使用深层复制。
您可以在此处详细了解有何不同之处:https://docs.python.org/2/library/copy.html
我不知道copy.copy
内部的内容是什么,所以当我不能自己尝试时,很难说两次运行相同的代码时会发生什么。
答案 1 :(得分:1)
关于有关运行for
循环多次广告获得相同id
的说明...这可能不是copy.copy
的问题,因为它复制顶级对象和顶级可变对象的id
应该不同,但内部可变对象的id
将保持不变,与copy.deepcopy
不同所有可变对象id
都应该不同。
可能是__import__
本身的问题......
在Python中导入模块时,它只导入一次。因此,当您发出模块的第一次导入时,某些模块会出现'some_module_a.py'它是导入的,然后,当您发出同一模块的第二次导入时,某些模块会出现'some_module_a.py'它不会再次导入,但会重新使用/返回对已导入模块的引用。
因此,如果您需要多次重新导入同一个模块,请首次导入该模块,然后使用importlib.reload
再次导入该模块。
答案 2 :(得分:0)
PdfCopy
执行浅拷贝,这意味着任何对象都将指向现有对象。如果您希望克隆其中的对象,则需要使用copy.deepcopy
。