这个问题与另一个问题 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 中的许多事情,结果的责任仅落在程序员身上。
按照难度递增的顺序:
真正可以安全复制或腌制的对象基本上是原始类型、字符串、列表、字典、数字等。
然后有许多对象明确支持魔术方法(例如__copy__
and __deepcopy__
)
然后,在某些对象上,复制将尽最大努力并取得成功。对于简单对象,仅包含对先前级别中的对象的引用。
-
最后,复制确实不安全:
- 具有许多循环引用的大型对象图
- 正在被其他线程使用和修改的对象。
- 具有外部资源的对象:文件、连接等。
- 包装或代理 C 库的对象
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)