为什么复制的对象与以前在Python中复制的对象具有相同的ID?

时间:2016-02-28 08:32:38

标签: python python-import

我试图了解一个观察结果。 我有一个应用程序,可以加载用户以后可以使用的各种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中的设置时,它们将在复制的设置中自动更改。

为什么会发生这种情况,我做错了什么?

3 个答案:

答案 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