Python выполняет глубокую копию содержимого слабого реф.прокси. Почему? Какой организации принадлежит ссылка?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Python выполняет глубокую копию содержимого слабого реф.прокси. Почему? Какой организации принадлежит ссылка?

Сообщение Anonymous »


У меня есть прокси-сервер слабой ссылки, и я хотел еще раз проверить свое предположение о том, что содержимое этого прокси-сервера не копируется при глубоком копировании прокси-сервера с помощью следующего кода:

импортировать копию импортировать слабую ссылку класс А: защита __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.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»