python - 为什么复制的对象与之前在 Python 中复制的对象具有相同的 id?

标签 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

随后,用户可以使用 imported_canvs 列表中的每个 Canvas 对象。但是,当我导入并实例化这些对象两次(再次运行 for 循环)时,我可以看到 id(new_canv_copy) 与之前导入和实例化的对象相同。 这不会是一个问题,除非每个 Canvas 都有每个实例唯一的设置,并且当前不会发生这种情况。每当用户更改一个 Canvas 中的设置时,它们也会在复制的 Canvas 中自动更改。

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

最佳答案

仅使用copy.copy()即可创建浅拷贝。在使用 copy.deepcopy() 复制对象时,您可能希望使用深层复制.

您可以在这里详细阅读有什么区别:https://docs.python.org/2/library/copy.html

我不知道 canv.Canvas() 里面做了什么,所以当你运行相同的代码两次而我无法自己尝试时,很难判断发生了什么。

关于python - 为什么复制的对象与之前在 Python 中复制的对象具有相同的 id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35680350/

相关文章:

python - PsychoPy:无法从并行端口读取数据

python - pandas 在pivot_table期间聚合多个列

python - QtSql 将 MySql 查询转换为 SQLite

python - Python继承检测如何工作?

python - 清除 sys.path 后 python 如何进行导入 - 导入优先级

Python值/引用/我都不知道

android - 从python输入adb shell

Python 3 绝对导入不起作用

python - 如何处理像这样的Python导入

python - 在 Python 中动态更改导入的引用