Изменяемые и неизменяемые объекты; адресная арифметика и ссылки
Изменяемые и неизменяемые объекты; адресная арифметика и ссылки
Объекты в Питоне бывают двух разновидностей - изменяемые и неизменяемые. Списки, например - объекты изменяемые, их содержимое и длину можно менять. Поскольку ключами словарей могут быть только неизменяемые объекты, в Питоне есть специальный тип неизменяемых списков - кортежи. Числа, естественно, объекты неизменяемые. Также неизменяемыми являются строки, в отличии от многих других языков программирования. Хотя классы, написанные программистами, порождают изменяемые объекты, у программиста есть возможность написать класс, экземпляры которого могут быть ключами словаря.
Адресной арифметики в Питоне нет. Вообще. Поэтому разименовать нулевой указатель просто невозможно. Ссылки (указатели) в Питоне есть, но манипулирование ими осуществляется прозрачно для программиста. В действительности все переменные в Питоне являются ссылками на объекты; поэтому, например, запись 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 окажется ссылка на новое число.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
64-битовая арифметика
64-битовая арифметика Арифметика 64-битовых указателей файлов не так уж сложна, и для ее реализации в примерах программ используется принятый в Microsoft С 64-битовый тип данных LARGE_INTEGER, объединяющий в одном типе данных union величину типа LONGLONG (носящую название QuadPart) и две
Арифметика
Арифметика gmp_addСложение двух чисел.Синтаксис:recource gmp_add(resource x, recource y)Функция возвратит GMP-число, равное сумме аргументов x и y.gmp_subВычитание двух чисел.Синтаксис:recource gmp_sub(resource x, recource y)Функция возвратит GMP-число, равное разности аргументов x и y.gmp_mulУмножение двух
Символические ссылки. Жесткие ссылки.
Символические ссылки. Жесткие ссылки. Немного теорииВ системах Unix довольно часто возникает необходимость иметь для одного и того же файла или каталога разные имена. При этом одно из имен логично назвать основным, а все другие - его псевдонимами. В терминологии Unix такие
Адресная книга
Адресная книга В бурной виртуальной жизни у вас наверняка появится множество друзей и знакомых по переписке, вследствие чего запутаться и потерять какой-нибудь важный электронный адрес в бездне приходящей почты проще простого. Чтобы исключить подобные неприятности,
Другие настройки реестра, изменяемые оснасткой
Другие настройки реестра, изменяемые оснасткой Теперь вкратце рассмотрим настройки других диалогов Свойства, представляющих интерес с точки зрения их взаимодействия с реестром Windows XP.? Чтобы запретить вывод сообщений об ошибках в работе устройств, подключенных к
Арифметика и bash
Арифметика и bash Скриптовой язык bash позволяет выполнять арифметические операции. Как вы уже видели в предыдущей статье, арифметика выполняется с помощью команды expr. Однако, подобно команде true, этот вариант считается медленным. Причина кроется в том, что для использования
Адресная арифметика
Адресная арифметика Аддитивные операции, выполняемые над указателем и целым, имеют осмысленный результат в том случае, если указатель адресует массив памяти, а целое значение представляет смещение в пределах этого массива. Преобразование целого значения к адресному
Просмотры только для чтения и изменяемые
Просмотры только для чтения и изменяемые Когда над просмотром выполняется операция DML, изменения могут быть переданы базовым таблицам, на основе которых был создан просмотр, только в случае выполнения некоторых условий. Если просмотр соответствует этим условиям, он
Глава 3 Списки, операторы, арифметика
Глава 3 Списки, операторы, арифметика В этой главе мы будем изучать специальные способы представления списков. Список - один из самых простых и полезных типов структур. Мы рассмотрим также некоторые программы для выполнения типовых операций над списками и, кроме того,
ОКНО ДИАЛОГА: Арифметика по Бутману
ОКНО ДИАЛОГА: Арифметика по Бутману Автор: Владимир ГуриевКомпьютеры Apple и так дешевыми не назовешь, но российским покупателям они особенно дороги. В экстремальных случаях разница в цене такова, что настырный Мак-юзер может слетать из Москвы в нью-йоркский Apple Store и
Адресная книга
Адресная книга Не забывайте добавлять ваших корреспондентов в адресную книгу. Сделать это просто — надо щелкнуть во входящем письме на ссылке в адресную книгу рядом с адресом отправителя (у поля От кого). Откроется окно добавления контакта в адресную книгу