Python copy.deepcopy() 失败,但没有引发警告、异常或错误

2024-02-14

这个问题与另一个问题 https://stackoverflow.com/questions/22683755/issue-while-trying-to-copy-pyside-object我昨天发布了,尽管它本质上更普遍。

由于我提到的线程,我一直在尝试确定哪些对象可以复制、腌制、封送,哪些对象不能。

在这样做的过程中,我偶然发现了这个难题:

new_obj = copy.deepcopy(my_obj)
function_that_uses_my_new_obj(new_obj)

throws:

    function_that_uses_my_new_obj(new_obj)

RuntimeError:内部 C++ 对象 (Pyside.QtGui.QWidget) 已删除

现在,自从my_obj is a C++对象,这个错误我可以理解。该特定问题的原因是另一个线程的主要主题。

但是,当我尝试时:

function_that_uses_my_new_obj(copy.deepcopy(my_obj))

我什么也没得到。程序正常运行到这一行,在那里停止几秒钟,然后停止执行,该行之后的代码不运行,不会抛出异常/错误/警告,并且Python提示符已准备好接受任何新命令。

EDIT

由于某种原因,使用copy()方法而不是deepcopy()像这样:

function_that_uses_my_new_obj(copy.copy(my_obj))

导致抛出相同的异常。所以必须有某个点deepcopy决定停止或正在停止并触发执行结束。我不明白的是为什么没有提出任何通知用户......


Copy 和 pickle 在所有情况下都会尝试完成它们的工作,但对于 python 中的许多事情,结果的责任仅落在程序员身上。

按照难度递增的顺序:

  1. 真正可以安全复制或腌制的对象基本上是原始类型、字符串、列表、字典、数字等。

  2. 然后有许多对象明确支持魔术方法(例如__copy__ and __deepcopy__)

  3. 然后,在某些对象上,复制将尽最大努力并取得成功。对于简单对象,仅包含对先前级别中的对象的引用。

  4. 最后,复制确实不安全:

    • 具有许多循环引用的大型对象图
    • 正在被其他线程使用和修改的对象。
    • 具有外部资源的对象:文件、连接等。
    • 包装或代理 C 库的对象
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python copy.deepcopy() 失败,但没有引发警告、异常或错误 的相关文章

随机推荐