Подтвердить что ты не робот

Слабые ссылки в python

Я пытался понять, как работает слайдер/словарь слайдов python, и читал документацию для него, но я не могу понять, как они работают и для чего их можно использовать. Может ли кто-нибудь дать мне базовый пример того, что они делают/объясняют, как они работают? Было бы очень благодарно.

(EDIT) Используя код Томаса, когда я заменяю obj на [1,2,3], он бросает:

Traceback (most recent call last):
File "C:/Users/nonya/Desktop/test.py", line 9, in <module>
r = weakref.ref(obj)
TypeError: cannot create weak reference to 'list' object
4b9b3361

Ответ 1

Теория

Счетчик ссылок обычно работает как таковой: каждый раз, когда вы создаете ссылку на объект, он увеличивается на единицу, и всякий раз, когда вы удаляете ссылку, она уменьшается на единицу.

Слабые ссылки позволяют создавать ссылки на объект, который не увеличивает счетчик ссылок.

Счетчик ссылок используется сборщиком мусора Python при его запуске: любой объект, счетчик ссылок которого равен 0, будет собирать мусор.

Вы используете слабые ссылки для дорогих объектов или избегаете ссылок на круг (хотя сборщик мусора обычно делает это сам по себе).

Использование

Вот рабочий пример, демонстрирующий их использование:

import weakref
import gc

class MyObject(object):
    def my_method(self):
        print 'my_method was called!'

obj = MyObject()
r = weakref.ref(obj)

gc.collect()
assert r() is obj #r() allows you to access the object referenced: it there.

obj = 1 #Let change what obj references to
gc.collect()
assert r() is None #There is no object left: it was gc'ed.

Ответ 2

Просто хочу указать, что weakref.ref не работает для встроенного списка, потому что в __slots__ списка нет __weakref__. Например, следующий код определяет контейнер списка, который поддерживает weakref.

import weakref

class weaklist(list):
    __slots__ = '__weakref__',

l = weaklist()
r = weakref.ref(l)

Ответ 3

Дело в том, что они позволяют сохранять ссылки на объекты, не мешая им собирать мусор.

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

Второй случай, вероятно, более распространен - ​​он уместен, когда вы держите, например. список уведомляемых объектов, и вы не хотите, чтобы система уведомлений предотвращала сбор мусора.