Главная » Просмотр файлов » Марк Лутц - Изучаем Python, Четвертое издание

Марк Лутц - Изучаем Python, Четвертое издание (1184811), страница 52

Файл №1184811 Марк Лутц - Изучаем Python, Четвертое издание (Марк Лутц - Изучаем Python, Четвертое издание) 52 страницаМарк Лутц - Изучаем Python, Четвертое издание (1184811) страница 522020-08-21СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 52)

Во внутреннем представлении переменная в действительности является указателем на пространство памяти с объектом, созданным в результате интерпретации литерального выражения 3Эти ссылки на объекты в языке Python так и называются ссылки, то есть ссылки – это своего рода ассоциативная связь, реализованная в виде указателя наобласть памяти.1 Когда бы ни использовалась переменная (то есть ссылка), интерпретатор Python автоматически переходит по ссылке от переменной к объекту. Все на самом деле гораздо проще, чем кажется. В конкретных терминах:•• Переменные – это записи в системной таблице, где предусмотрено место дляхранения ссылок на объекты.•• Объекты – это области памяти с объемом, достаточным для представлениязначений этих объектов.•• Ссылки – это автоматически разыменовываемые указатели на объекты.Всякий раз, по крайней мере концептуально, когда в сценарии в результате выполнения выражения создается новое значение, интерпретатор Python создаетновый объект (то есть выделяет область памяти), представляющий это значение.

Внутренняя реализация интерпретатора с целью оптимизации кэширует и повторно использует некоторые типы неизменяемых объектов, такие какмалые целые числа и строки (каждый 0 в действительности не является новойобластью в памяти; подробнее о механизме кэширования мы поговорим поз1Читатели, знакомые с языком C, сочтут, что между ссылками в языке Python и указателями в языке C много общего (адреса в памяти).

И действительно, ссылки реализованы как указатели и они часто играют ту же роль, особенно когда объект относится к категории изменяемых (подробнее об этом будет говориться ниже). Однако,так как ссылки при использовании всегда автоматически разыменовываются, выникак не сможете использовать саму ссылку – эта особенность ликвидирует огромный пласт ошибок, которые можно допустить в языке C. Вы можете считать ссылкиуказателями типа «void» в языке C, которые автоматически разыменовываются прилюбом использовании.Отсутствие инструкций объявления197же). Но с логической точки зрения все выглядит так, как если бы результаткаждого выражения был представлен отдельным объектом и каждый объектзанимал отдельную область памяти.С технической точки зрения объекты имеют более сложную структуру, чемпросто пространство в памяти, необходимое для хранения значения.

Каждыйобъект имеет два стандартных поля: описатель типа, используемый для хранения информации о типе объекта, и счетчик ссылок, используемый для определения момента, когда память, занимаемая объектом, может быть освобождена. Чтобы понять, какую роль играют эти два поля в модели динамическойтипизации, нам необходимо двинуться дальше.Информация о типе хранится в объекте,но не в переменнойЧтобы увидеть, как используется информация о типах объектов, посмотрим,что произойдет, если выполнить несколько операций присваивания однойи той же переменной:>>> a = 3# Это целое число>>> a = ‘spam’ # Теперь это строка>>> a = 1.23# Теперь это вещественное числоЭто не совсем типичный программный код на языке Python, но он работает –сначала создается целое число, потом строка и, наконец, вещественное число.Этот пример особенно странно выглядит для программистов, использовавшихязык C, поскольку он выглядит так, как если бы при выполнении инструкцииa = ‘spam’ производилось изменение типа переменной с целочисленного на строковый.Однако в действительности этого не происходит.

В языке �������������������Python�������������все реализовано намного проще: имена не имеют типов, как уже указывалось ранее, тип –это свойство объекта, а не имени. В предыдущем листинге просто изменяетсяссылка на объект. Так как переменные не имеют типов, мы в действительностине изменяем типы переменных – мы просто записываем в переменные ссылкина объекты других типов. На самом деле, все, что можно сказать о переменныхв языке Python,��������������������������������������������������������������������������������������������������������������������������������� – это то, что они ссылаются на конкретные объекты в конкретные моменты времени.С другой стороны, объекты знают, к какому типу они относятся, – каждыйобъект содержит поле, в котором хранится информация о его типе.

Целочисленный объект 3, например будет содержать значение 3 плюс информацию,которая сообщит интерпретатору Python, что объект является целым числом(строго говоря – это указатель на объект с названием int, которое играет рольимени целочисленного типа). Описатель типа для строки ‘spam’ указывает настроковый тип (с именем str).

Поскольку информация о типе хранится в объектах, ее не нужно хранить в переменных.Итак, типы в языке Python������������������������������������������������������������������������������������������������������ – это свойства объектов, а не переменных. В типичном программном коде переменная обычно ссылается на объекты толькоодного типа. Т. к. для языка ����������������������������������������������Python����������������������������������������это не является обязательным требованием, программный код на языке Python обладает более высокой гибкостью, чемвам может показаться, – при умелом использовании особенностей языка программный код смог бы работать со многими типами автоматически.198Глава 6.

Интерлюдия о динамической типизацииЯ уже упоминал, что каждый объект имеет два поля – описатель типа и счетчик ссылок. Чтобы разобраться с последним из них, нам нужно пойти ещедальше и взглянуть, что происходит в конце жизненного цикла объекта.Объекты уничтожаются автоматическиВ листинге из предыдущего раздела мы присваивали одной и той же переменной объекты различных типов. Но что происходит с прежним значением, когдавыполняется новое присваивание? Например, что произойдет с объектом 3 после выполнения следующих инструкций;>>> a = 3>>> a = ‘spam’Дело в том, что всякий раз, когда имя ассоциируется с новым объектом, интерпретатор Python освобождает память, занимаемую предыдущим объектом(если на него не ссылается какое-либо другое имя или объект).

Такое автоматическое освобождение памяти, занимаемой объектами, называется сборкоймусора (garbage collection).Чтобы проиллюстрировать сказанное, рассмотрим следующий пример, гдес имя x ассоциируется с разными объектами при выполнении каждой операции присваивания:>>>>>>>>>>>>xxxx= 42= ‘shrubbery’ # Освобождается объект 42 (если нет других ссылок)= 3.1415# Теперь освобождается объект ‘shrubbery’= [1,2,3]# Теперь освобождается объект 3.1415Первое, что следует отметить, – каждый раз с именем x связывается объектдругого типа. Снова, хотя в действительности это не так, возникает ощущение изменения типа переменной x с течением времени.

Напомню, что в языкеPython типы связаны с объектами, а не с именами. Так как имена – это всеголишь ссылки на объекты, данный код работает.Во-вторых, следует помнить, что попутно уничтожаются ссылки на объекты.Каждый раз, когда имя x ассоциируется с новым объектом, интерпретатор Py���thon освобождает пространство, занятое прежним объектом.

Например, когдас именем x связывается строка ‘shrubbery’, объект 42 немедленно уничтожается(при условии, что на него не ссылается никакое другое имя), а пространствопамяти, занимаемое объектом, возвращается в пул свободной памяти для повторного использования в дальнейшем.Достигается это за счет того, что в каждом объекте имеется счетчик ссылок,с помощью которого интерпретатор следит за количеством ссылок, указывающих на объект в настоящий момент времени.

Как только (и именно в этот момент) значение счетчика достигает нуля, память, занимаемая объектом, автоматически освобождается. В предыдущем листинге мы исходили из предположения, что всякий раз, когда имя x ассоциируется с новым объектом, счетчикпредыдущего объекта уменьшается до нуля, заставляя интерпретатор освобождать память.Основная выгода от сборки мусора состоит в том, что программист может свободно распоряжаться объектами, не будучи обязан освобождать память в сво-Разделяемые ссылки199ем сценарии.

Интерпретатор сам будет выполнять очистку неиспользуемой памяти в ходе выполнения программы. На практике эта особенность позволяетсущественно уменьшить объем программного кода по сравнению с низкоуровневыми языками программирования, такими как C и C++.Строго говоря, механизм сборки мусора в основном опирается насчетчики ссылок, как было описано выше, однако он способентакже обнаруживать и удалять объекты с циклическими ссылками. Эту особенность можно отключить, если вы уверены, чтов программе не создаются объекты с циклическими ссылками,но по умолчанию она включена.Поскольку ссылки реализованы в виде указателей, существует возможность создать в объекте ссылку на самого себя илина другой объект, который ссылается сам на себя.

Например,упражнение 6 в конце первой части и его решение в приложенииB демонстрируют возможность создания циклической ссылки,за счет включения в список ссылки на сам список. То же можетпроизойти при присваивании значений атрибутам объектовпользовательских классов. Несмотря на относительную редкость таких ситуаций, должен быть предусмотрен механизм ихобработки, потому что счетчики ссылок в таких объектах никогда не достигнут нуля.Дополнительную информацию об обнаружении циклическихссылок можно найти в описании модуля gc, в справочном руководстве по стандартной библиотеке языка Python. Обратитетакже внимание, что данное описание применимо только к механизму сборки мусора в стандартной реализации CPython�����������������.

Реализации Jython��������������������������������������������������������������������������������������������и ����������������������������������������IronPython������������������������������могут использовать иные принципы работы, хотя и дающие тот же эффект – неиспользуемоепространство освобождается автоматически.Разделяемые ссылкиДо сих пор мы рассматривали вариант, когда ссылка на объект присваивается единственной переменной. Теперь введем в действие еще одну переменнуюи посмотрим, что происходит с именами и объектами в этом случае:>>> a = 3>>> b = aВ результате выполнения этих двух инструкций получается схема взаимоотношений, отраженная на рис. 6.2. Вторая инструкция вынуждает интерпретатор создать переменную b и использовать для инициализации переменную a,при этом она замещается объектом, на который ссылается (3), и b превращается в ссылку на этот объект.

В результате переменные a и b ссылаются на одини тот же объект (то есть указывают на одну и ту же область в памяти). В языкеPython это называется разделяемая ссылка – несколько имен ссылаются наодин и тот же объект.200Глава 6. Интерлюдия о динамической типизацииИменаa=3b=aСсылкиaОбъекты3bРис. 6.2. Имена и объекты после выполнения инструкции присваивания b =a. Переменная b превращается в ссылку на объект 3. С технической точкизрения переменная в действительности является указателем на областьпамяти объекта, созданного в результате выполнения литерального выражения 3Далее добавим еще одну инструкцию:>>> a = 3>>> b = a>>> a = ‘spam’Как во всех случаях присваивания в языке Python, в результате выполненияэтой инструкции создается новый объект, представляющий строку ‘spam’,а ссылка на него записывается в переменную a. Однако эти действия не оказывают влияния на переменную b – она по-прежнему ссылается на первый объект, целое число 3.

Характеристики

Тип файла
PDF-файл
Размер
12,21 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6294
Авторов
на СтудИзбе
314
Средний доход
с одного платного файла
Обучение Подробнее