Как удалить каждую ссылку на объект в Python? - PullRequest
7 голосов
/ 10 июня 2010

Предположим, у вас есть что-то вроде:

x = "something"
b = x
l = [b]

Как вы можете удалить объект, имеющий только одну ссылку, скажем, х?

del x не сработает; например, объект по-прежнему доступен из b.

Ответы [ 3 ]

13 голосов
/ 10 июня 2010

Нет, нет, нет. В Python есть сборщик мусора, у которого очень серьезные проблемы с территориями - он не будет мешать вам создавать объекты, вы не будете связываться с ним, удаляя объекты.

Проще говоря, это невозможно сделать, и на то есть веская причина.

Если, например, вам нужны, например, алгоритмы кэширования, которые хранят ссылки, но не должны препятствовать сборке данных, если их никто не использует, вы можете взглянуть на weakref.

8 голосов
/ 10 июня 2010

Единственное решение, которое я вижу сейчас, это то, что вы должны убедиться, что вы держите единственную ссылку на x, все остальные должны не получить x сам, нослабая ссылка, указывающая на x.Слабые ссылки реализованы в модуле weakref, и вы можете использовать его следующим образом:

>>> import weakref
>>> class TestClass(object):
...     def bark(self):
...         print "woof!"
...     def __del__(self):
...         print "destructor called"
...
>>> x = TestClass()
>>> b = weakref.proxy(x)
>>> b
<weakproxy at 0x7fa44dbddd08; to TestClass at 0x7fa44f9093d0>
>>> b.bark()
woof!
>>> del x
destructor called
>>> b.bark()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ReferenceError: weakly-referenced object no longer exists

Однако обратите внимание, что не все классы могут иметь слабые ссылки.В частности, большинство встроенных типов не могут.Некоторые встроенные типы могут иметь слабые ссылки, если вы подклассируете их (например, dict), но другие не могут (например, int).

6 голосов
/ 10 июня 2010

Ты не.Вот и весь смысл.Представьте, что l находится в библиотеке вне вашего контроля.Он имеет полное право ожидать, что элементы коллекции не исчезнут.

Кроме того, представьте, если бы это было иначе.У вас будут вопросы по поводу SO "Как я могу запретить другим пользователям удалять мои объекты?"Как дизайнер языка, вы не можете удовлетворить оба требования.

...