Python выполняет глубокую копию содержимого слабого реф.прокси. Почему? Какой организации принадлежит ссылка? ⇐ Python
Python выполняет глубокую копию содержимого слабого реф.прокси. Почему? Какой организации принадлежит ссылка?
У меня есть прокси-сервер слабой ссылки, и я хотел еще раз проверить свое предположение о том, что содержимое этого прокси-сервера не копируется при глубоком копировании прокси-сервера с помощью следующего кода:
импортировать копию импортировать слабую ссылку класс А: защита __init__(self, val=3): self.val = значение определение идентификации (сам): вернуть идентификатор (собственный) а = А() прокси = слабыйref.proxy(a) прокси.val = 4 proxy_deepcopy = copy.deepcopy(прокси) 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 Однако мое предположение кажется неверным; глубокая копия a выполняется при глубоком копировании прокси. Я неправильно интерпретирую результаты тестов или у меня неправильное представление о том, как должен работать weakref.proxy? Разве скопированный экземпляр A не должен быть немедленно GCed?
Я проверил в Интернете и обнаружил, что ожидаемое поведение происходит при использовании weakref.ref вместо weakref.proxy (который, как я думал, был в основном семантическим сахаром).
Из-за этой строки в модуле копирования CPython, которую я нашел, читая ответ на вопрос о переполнении стека на слабом ref.ref, использование слабого ref.ref дает ожидаемые результаты:
proxy = слабыйref.ref(a) прокси().val = 4 proxy_deepcopy = copy.deepcopy(прокси) 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 Это несоответствие между слабыми ссылками.proxy и слабыми ссылками.ref намеренно?
Кто является владельцем глубоко скопированного экземпляра A, который по-прежнему доступен через proxy_deepcopy?
Выполнено в версиях 3.8.18 и 3.10.13.
У меня есть прокси-сервер слабой ссылки, и я хотел еще раз проверить свое предположение о том, что содержимое этого прокси-сервера не копируется при глубоком копировании прокси-сервера с помощью следующего кода:
импортировать копию импортировать слабую ссылку класс А: защита __init__(self, val=3): self.val = значение определение идентификации (сам): вернуть идентификатор (собственный) а = А() прокси = слабыйref.proxy(a) прокси.val = 4 proxy_deepcopy = copy.deepcopy(прокси) 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 Однако мое предположение кажется неверным; глубокая копия a выполняется при глубоком копировании прокси. Я неправильно интерпретирую результаты тестов или у меня неправильное представление о том, как должен работать weakref.proxy? Разве скопированный экземпляр A не должен быть немедленно GCed?
Я проверил в Интернете и обнаружил, что ожидаемое поведение происходит при использовании weakref.ref вместо weakref.proxy (который, как я думал, был в основном семантическим сахаром).
Из-за этой строки в модуле копирования CPython, которую я нашел, читая ответ на вопрос о переполнении стека на слабом ref.ref, использование слабого ref.ref дает ожидаемые результаты:
proxy = слабыйref.ref(a) прокси().val = 4 proxy_deepcopy = copy.deepcopy(прокси) 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 Это несоответствие между слабыми ссылками.proxy и слабыми ссылками.ref намеренно?
Кто является владельцем глубоко скопированного экземпляра A, который по-прежнему доступен через proxy_deepcopy?
Выполнено в версиях 3.8.18 и 3.10.13.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение