Удалить ссылку на объект, но сохранить объект в памяти, если есть ссылка в другом месте - PullRequest
1 голос
/ 25 марта 2019

Я столкнулся с проблемой: Функция получает ссылки на объекты и вызывает del для этих ссылок в определенный момент во время своей процедуры.

Эти ссылки относятся к объектам, на которые иногда ссылаются в других местах, а иногда нет.

Я бы хотел, чтобы оператор del удалял только ссылку, присутствующую в функции. Если на этот объект нет ссылки в другом месте программы, он может быть собран мусором. Если я прав, del напрямую вызывает деструктор объекта, а не просто удаляет его ссылку. Как я могу получить желаемое поведение?

1 Ответ

2 голосов
/ 25 марта 2019

Если я прав, del напрямую вызывает деструктор объекта, а не просто удаляет его ссылку.

Предполагается, что это неверно для CPython.

del уменьшает счетчик ссылок объекта на 1. И объект собирает мусор, когда счетчик ссылок достигает 0.

Если под деструктором вы имели в виду магический метод __del__, обратите внимание, что он обычно вызывается при сборке мусора, а не при вызове del.Более того, нет никакой гарантии, что метод будет даже вызван .

Просто отметим, что есть также (необязательный) интерфейс gc, который может прерывать циклы ссылки на объект.

...