Python 对 weakref.proxy 的内容执行深度复制。为什么?哪个实体拥有引用?

python performs a deepcopy of a weakref.proxy's content. Why? Which entity owns the reference?

提问人:mutableVoid 提问时间:10/24/2023 最后编辑:mutableVoid 更新时间:10/25/2023 访问量:69

问:

我想仔细检查我的假设,即在执行深度复制时,它的内容没有被深度复制。为此,我编写了以下代码片段: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 吗?aproxyweakref.proxyA

我在互联网上查了一下,发现预期的行为发生在使用而不是 (我认为主要是语义糖)时。weakref.refweakref.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 之间的这种差异是有意的吗?

谁是 的深度复制实例的所有者,该实例仍可通过 ?Aproxy_deepcopy

在 3.8.18 和 3.10.13 中执行。CPython

python-3.x 深拷贝 弱引用

评论


答: 暂无答案