提问人:mutableVoid 提问时间:10/24/2023 最后编辑:mutableVoid 更新时间:10/25/2023 访问量:69
Python 对 weakref.proxy 的内容执行深度复制。为什么?哪个实体拥有引用?
python performs a deepcopy of a weakref.proxy's content. Why? Which entity owns the reference?
问:
我想仔细检查我的假设,即在执行深度复制时,它的内容没有被深度复制。为此,我编写了以下代码片段:weakref.proxy
import copy
import weakref
class A:
def __init__(self, val=3):
self.val = val
def identify(self):
return id(self)
a = A()
proxy = weakref.proxy(a)
proxy.val = 4
proxy_deepcopy = copy.deepcopy(proxy)
proxy_deepcopy.val = 5
print(a.val, a.identify()) # 4 139732708115984
print(proxy.val, proxy.identify()) # 4 139732708115984
print(proxy_deepcopy.val, proxy_deepcopy.identify()) # 5 139732690146640
然而,我的假设似乎是不正确的;深度复制时执行深度复制。我是误解了测试结果,还是对测试应该如何工作有误解?复制的实例不应该立即进行 GCed 吗?a
proxy
weakref.proxy
A
我在互联网上查了一下,发现预期的行为发生在使用而不是 (我认为主要是语义糖)时。weakref.ref
weakref.proxy
由于 CPython 复制模块中的这一行,我发现使用 weakref.ref 在 weakref.ref 上阅读此堆栈溢出答案会产生我所期望的结果:
proxy = weakref.ref(a)
proxy().val = 4
proxy_deepcopy = copy.deepcopy(proxy)
proxy_deepcopy().val = 5
print(a.val, a.identify()) # 5 140323837493200
print(proxy().val, proxy().identify()) # 5 140323837493200
print(proxy_deepcopy().val, proxy_deepcopy().identify()) # 5 140323837493200
weakref.proxy 和 weakref.ref 之间的这种差异是有意的吗?
谁是 的深度复制实例的所有者,该实例仍可通过 ?A
proxy_deepcopy
在 3.8.18 和 3.10.13 中执行。CPython
答: 暂无答案
评论