Читаем Python - основные концепции полностью

Объекты в Питоне бывают двух разновидностей - изменяемые и неизменяемые. Списки, например - объекты изменяемые, их содержимое и длину можно менять. Поскольку ключами словарей могут быть только неизменяемые объекты, в Питоне есть специальный тип неизменяемых списков - кортежи. Числа, естественно, объекты неизменяемые. Также неизменяемыми являются строки, в отличии от многих других языков программирования. Хотя классы, написанные программистами, порождают изменяемые объекты, у программиста есть возможность написать класс, экземпляры которого могут быть ключами словаря.

Адресной арифметики в Питоне нет. Вообще. Поэтому разименовать нулевой указатель просто невозможно. Ссылки (указатели) в Питоне есть, но манипулирование ими осуществляется прозрачно для программиста. В действительности все переменные в Питоне являются ссылками на объекты; поэтому, например, запись 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 окажется ссылка на новое число.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных