Подсчет ссылок

Подавляющее большинство управления памятью Python выполняется с подсчетом ссылок.

Каждый раз, когда на объект ссылаются (например, назначают на переменную), его счетчик ссылок автоматически увеличивается. При разыменовании (например, переменная выходит из области видимости) ее счетчик ссылок автоматически уменьшается.

Когда счетчик ссылок достигает нуля, объект немедленно уничтожается и память сразу же освобождается. Таким образом, в большинстве случаев сборщик мусора даже не нужен.

 >>> import gc; gc.disable()  # disable garbage collector
>>> class Track:
        def __init__(self):
            print("Initialized")
        def __del__(self):
            print("Destructed")
>>> def foo():
        Track()
        # destructed immediately since no longer has any references
        print("---")
        t = Track()
        # variable is referenced, so it's not destructed yet
        print("---")
        # variable is destructed when function exits
>>> foo()
Initialized
Destructed
---
Initialized
---
Destructed 

Для дальнейшей демонстрации концепции ссылок:

 >>> def bar():
        return Track()
>>> t = bar()
Initialized
>>> another_t = t  # assign another reference
>>> print("...")
...
>>> t = None          # not destructed yet - another_t still refers to it
>>> another_t = None  # final reference gone, object is destructed
Destructed