Python - основные концепции :: Бройтман Олег
Страница:
5 из 6
Также списки и словари хранят не объекты, а ссылки на объекты. Присваивание и разыменование ссылок производится автоматически.
Каждый объект в Питоне хранит счетчик ссылок, и при таком копировании ссылки этот счетчик увеличивается. Счетчик же ссылок того объекта, на который переменная a указывала раньше - уменьшается. Когда счетчик достигает 0, объект считается неиспользуемым, для него вызывается деструктор (если это экземпляр класса с деструктором), и память объекта освобождается.
Такой механизм называется "синхронной сборкой мусора со счетчиком ссылок". Помимо него, в Питоне есть асинхронный сборщик мусора, достоинство которого в том, что он умеет распознавать циклические ссылки и очищать объекты, на которые нет других ссылок (не из цикла). (Пример циклических ссылок: l=[]; l.append(l))
Рассмотрим поподробнее питоновские ссылки. Создадим список и присвоим его (на самом деле присвоим ссылку на него) в переменную a : a = [21, 12, "str"]. Теперь присвоим ссылку из a в переменную b : a = b . Изменим список, на который ссылается a , скажем, добавим в него содержимое другого списка: a += [2000]. На какой список ссылается переменная b ? На тот же, что и a - на список из 4 элементов. Происходит это потому, что b все еще хранит ссылку на тот же список, что и a . А теперь присвоим в a новый список: a = [12, 21]. Что теперь будет в b ? А все тот же список из 4 элементов. Присваивание в a разорвало связь между a и b . В переменной a теперь ссылка на новый список, а в переменной b все та же ссылка на тот же список.
|< Пред. 2 3 4 5 6 След. >|