Python - основные концепции - [2]

Шрифт
Интервал

Адресной арифметики в Питоне нет. Вообще. Поэтому разименовать нулевой указатель просто невозможно. Ссылки (указатели) в Питоне есть, но манипулирование ими осуществляется прозрачно для программиста. В действительности все переменные в Питоне являются ссылками на объекты; поэтому, например, запись a = b означает "в переменную a скопировать ссылку из переменной b". Также списки и словари хранят не объекты, а ссылки на объекты. Присваивание и разыменование ссылок производится автоматически.

Каждый объект в Питоне хранит счетчик ссылок, и при таком копировании ссылки этот счетчик увеличивается. Счетчик же ссылок того объекта, на который переменная 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 все та же ссылка на тот же список.

Если a - переменная, хранящая ссылку на список, и присваивание b = a копирует только ссылку на тот же список, то можно ли скопировать сам список? Короткий ответ - да, можно. Но не все так просто. Ведь и сам список хранит не объекты, а ссылки на объекты. Должны ли копироваться эти ссылки или должны быть продублированы и сами объекты? Питон дает два ответа на этот вопрос: можно сделать и так, и эдак. Первый вариант копирования называется "поверхностным", второй - "глубоким" копированием. Глубокое копирование учитывает циклические ссылки. Классы, написанные программистом, могут определять методы, участвующие в копировании, тем самым "помогая" процессу копирования, для того чтобы не включать в копирование лишней информации.

Манипуляции с неизменяемыми объектами осуществляются путем создания новых объектов. Например, если в строке надо заменить символ, исходная строка разбивается на две подстроки, и из них (плюс новый символ) создается новая строка. Если в переменной a ссылка на цело число, то в результате операции a += 1 в a окажется ссылка на новое число.


Еще от автора Олег Бройтман
Драматическая история Python и Zope

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


DirectX 8. Начинаем работу с DirectX Graphics

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


MFC и OpenGL

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


Симуляция частичной специализации

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


Обработка событий в С++

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