Изменяемые и неизменяемые объекты в Python
Все в Python – это объект. Каждый новичок должен сразу усвоить, что все объекты в Python могут быть либо изменяемыми (мутабельным), либо неизменяемыми (иммутабельным).
Давайте углубимся в детали. Поскольку все в Python является объектом, то каждая переменная является экземпляром какого-то класса (объектом). Когда объект инстанцируется, ему присваивается уникальный id. Тип объекта определяется во время выполнения и после этого не меняется, однако состояние может меняться, если оно изменяемое. Проще говоря, изменяемый объект можно изменить после его создания, а неизменяемый – нет.
Объекты встроенных типов, таких как int, float, bool, str, tuple, unicode, являются неизменяемыми. Объекты встроенных типов, таких как list, set, dict, являются изменяемыми. Самописные классы, как правило, изменяемые. Если есть потребность сымитировать неизменяемость, нужно переопределить методы установки и удаления атрибутов класса так, чтобы они вызывали исключения.
Возникает вопрос, как узнать, что наша переменная изменяемый или неизменяемый объект. Для этого нам нужно понять, зачем нужны функции id и type.
Id() и type()
Встроенная функция id() возвращается id объекта в виде целого числа. Число обычно коррелирует с местоположением объекта в памяти, но не всегда, поскольку все зависит от реализации Python и используемой платформы. Оператор is сравнивает id двух объектов.
Встроенная функция type() возвращает тип объекта. Давайте обратимся к примеру.
''' Example 1 ''' >>> x = "Holberton" >>> y = "Holberton" >>> id(x) 140135852055856 >>> id(y) 140135852055856 >>> print(x is y) '''comparing the types''' True ''' Example 2 ''' >>> a = 50 >>> type(a) >>> b = "Holberton" >>> type(b)
Теперь мы знаем, как сравнить две простые строковые переменные, чтобы определить их тип и id. С помощью этих двух функций мы можем узнать типы объектов связанных с переменными и их изменяемость/неизменяемость.
Изменяемые и неизменяемые объекты
Итак, как мы выяснили, изменяемый объект может изменять свое состояние или содержимое, а неизменяемый – нет.
Изменяемые объекты:
list, dict, set, byte array
Неизменяемые объекты:
int, float, complex, string, tuple, frozenset (неизменяемая версия set), bytes
Пример определения изменяемости объекта:
x = 10 x = y
Мы создаем объект типа int. Id x и y указывают на один и тот же объект:
id(x) == id(y) id(y) == id(10)
А теперь просто прибавим единицу:
x = x + 1
id(x) != id(y) id(x) != id(10)
Объект переменной x изменился. Объект 10 не может изменяться. Неизменяемые объекты не допускают изменений после создания.
А если объект изменяемый:
m = list([1, 2, 3]) n = m
Мы создаем объект типа list. Id переменных m и n привязаны к одному списку, в котором лежит коллекция из трех неизменяемых объектов типа int.
id(m) == id(n)
Удаление элемента из объекта списка изменяет сам объект:
m.pop()
Но id объекта не изменяется
id(m) == id(n)
Переменные m и n будут указывать на один и тот же объект списка после изменения. В объекте списка теперь лежит [1,2].
Итак, что же мы поняли из примеров выше?
- Python обрабатывает изменяемые и неизменяемые объекты по-разному.
- Доступ к неизменяемым объектам осуществляется быстрее, чем к изменяемым.
- Изменяемые объекты отлично подойдут, если вам нужно менять размер объектов, например, list, dict и т.д.
- Неизменяемые значения используются, когда вам нужно убедиться, что созданный вами объект никогда не будет меняться.
- Неизменяемые объект принципиально дорого менять, поскольку для этого требуется создать копию, а изменяемые менять легко.
Исключения в неизменяемости
Не все неизменяемые объекты на самом деле являются неизменяемыми. Запутались? Позвольте мне объяснить.
Как мы говорили ранее, такие коллекции в Python, как кортежи, неизменяемы. То есть значение кортежа нельзя менять после его создания. Но значение кортежа на самом деле – это последовательность имен с неизменяемыми привязками к объектам. Главное, что нужно понимать, так это то, что сами «привязки» менять нельзя, а вот объекты на их концах – можно.
Рассмотрим кортеж t = (‘holberton’, [1, 2, 3])
Он содержит элементы разных типов данных, первый из которых – неизменяемая строка, а второй – изменяемый список. Сам со себе кортеж неизменяемый, то есть для него нет методов изменения содержимого. Строка также неизменяемая по той же причине. Но у списка есть такие методы, поэтому его можно изменить. Здесь тонкий момент, но не менее важный: «значение» неизменяемого объекта не может измениться, а вот его элементы могут.
Как объекты передаются в функции
Для нас важно знать разницу между изменяемыми и неизменяемыми типами, чтобы понимать, как они обрабатываются при передаче в функции. Эффективность использования памяти сильно зависит от выбора соответствующих объектов.
Например, если изменяемый объект вызывается по ссылке в функции, он может изменить исходную переменную. Следовательно, чтобы избежать этого, исходную переменную надо скопировать в другую переменную. Неизменяемые объекты можно передавать по ссылке, потому что их значение в любом случае не может меняться.
def updateList(list1): list1 += [10] n = [5, 6] print(id(n)) # 140312184155336 updateList(n) print(n) # [5, 6, 10] print(id(n)) # 140312184155336
Как видно из примера выше, мы получили доступ к списку по ссылке, поэтому смогли изменить исходный список.
Давайте посмотрим на другой пример:
def updateNumber(n): print(id(n)) n += 10 b = 5 print(id(b)) # 10055680 updateNumber(b) # 10055680 print(b) # 5
В примере выше в функцию передается один и тот же объект, но значение переменных не меняется даже если их id одинаковые. Так работает передача по значению. Что же здесь происходит? Когда функция вызывает значение, передается только значение переменной, а не сам объект. Таким образом, переменная, ссылающаяся на объект, не изменяется, а сам объект изменяется, но только в пределах области видимости функции. Следовательно, изменение не видно «снаружи».
В завершение приглашаем всех на бесплатный урок, где поговорим про организацию рабочего места:
- что такое IDE и какие IDE существуют;
- как настроить самую полнофункциональную IDE для Python — PyCharm Community Edition;
- версии Python, почему их так много;
- как разрабатывать несколько проектов на одной машине (что нужно учитывать, зачем нужны виртуальные среды (venv) для проектов) и что это такое;
- как запустить приложение в Docker-контейнере (зачем это делать, как это можно сделать, что нужно учесть).
В результате вы сможете организовать изолированную среду для разработки и запуска приложения с помощью venv и docker, узнаете почему существуют различные версии Python, и как организовать свое рабочее место, чтобы разрабатывать несколько различных проектов, использующих разные версии Python и сторонних пакетов, одновременно, и без боли.
Типы данных в Python
Ключевое слово null обычно используется во многих языках программирования, таких как Java, C++, C# и JavaScript. Это значение, которое присваивается переменной.
Концепция ключевого слова null в том, что она дает переменной нейтральное или «нулевое» поведение.
А что же в Python?
Числа: целые, вещественные, комплексные
Числа в Python 3: целые, вещественные, комплексные. Работа с числами и операции над ними.
Исключения в python. Конструкция try — except для обработки исключений
Исключения (exceptions) — ещё один тип данных в python. Исключения необходимы для того, чтобы сообщать программисту об ошибках.
Байты (bytes и bytearray)
Байтовые строки в Python — что это такое и с чем это едят? Байтовые строки очень похожи на обычные строки, но с некоторыми отличиями. Попробуем выяснить, с какими.
Файлы. Работа с файлами.
В данной статье мы рассмотрим встроенные средства python для работы с файлами: открытие / закрытие, чтение и запись.
Множества (set и frozenset)
Доброго времени суток! Сегодня я расскажу о работе с множествами в python, операциях над ними и покажу примеры их применения.
Функции и их аргументы
В этой статье я планирую рассказать о функциях, именных и анонимных, инструкциях def, return и lambda, обязательных и необязательных аргументах функции, функциях с произвольным числом аргументов.
Кортежи (tuple)
Сегодня я расскажу о таком типе данных, как кортежи (tuple) и о том, где они применяются.
Словари (dict) и работа с ними. Методы словарей
Сегодня я расскажу о таком типе данных, как словари, о работе со словарями, операциях над ними, методах, о генераторах словарей.
Списки (list). Функции и методы списков
Сегодня я расскажу о таком типе данных, как списки, операциях над ними и методах, о генераторах списков и о применении списков.
- Книги о Python
- GUI (графический интерфейс пользователя)
- Курсы Python
- Модули
- Новости мира Python
- NumPy
- Обработка данных
- Основы программирования
- Примеры программ
- Типы данных в Python
- Видео
- Python для Web
- Работа для Python-программистов
- Сделай свой вклад в развитие сайта!
- Самоучитель Python
- Карта сайта
- Отзывы на книги по Python
- Реклама на сайте
3. Типы данных в Python
Переменная — это контейнер для хранения различных значений (данных). Данные в программировании бывают различных типов, разберём некоторые из них.
Тип данных
Обозначение
Ограничения
Тип переменной определяется автоматически, когда мы присвоили ей какое-то значение.
\(a=15\) | #\(a\) — целого типа |
\(b=15,4\) | #\(b\) — вещественного типа |
\(s=\) «Привет» | #\(s\) — строкового типа |
Определить переменную помогает команда type().
Тип переменных можно изменить.
пусть переменная \(a\) сначала будет вещественного типа, для этого нужно написать: \(а=15,25\).
После проверки её типа командой type(a) получим ответ: , что означает, что переменная \(a\) вещественного типа.
Изменим тип, для этого запишем: \(a=int(a)\).
После проверки увидим результат:
Что означает, что \(a\) теперь целого типа.
Рис. \(1\). Изменение типа данных
Какие типы данных существуют в программировании
Когда классифицируете типы данных, легче определить, где они хранятся и для каких операций применяются.
Анастасия Хамидулина
Автор статьи
1 августа 2023 в 12:01
Данные — это зафиксированные сведения, с которыми работает компьютер: получает, обрабатывает и передает. В программировании есть несколько видов данных. Новичкам нужно разбираться в данных, чтобы быстрее научиться кодить и понимать алгоритмы.
Что такое тип данных, зачем он нужен
Переменные в математике классифицируют по ключевым характеристикам:
- вещественные;
- комплексные;
- логические;
- отдельные значения;
- множества значений;
- множества множеств.
Тип — это характеристика значений, которые переменная или выражение принимает. Функция тоже может сформировать тип.
Типизация — процесс определения типа информационными сущностями. Она бывает нескольких видов:
- статическая — заранее назначает и проверяет;
- динамическая — всё делает в процессе;
- статично-динамическая — совмещает оба предыдущих типа.
По назначению типов:
- сильная — навсегда;
- слабая — допускает изменения.
Многие языки программирования типизированы частично. Если типизация слабая, то можно и отступиться от правил систематизации типов. Программы со слабой типизацией проще сделать более эффективными. Но из-за слабой типизации в коде может появиться много ошибок — багов.
На курсах Skypro, например «Java-разработчик», учат писать чистый код, а еще самостоятельно тестировать его, находить и исправлять ошибки. В результате напишете несколько приложений, которые можно положить в портфолио.
Какие бывают типы данных
Основополагающее понятие в программировании — это виды данных. Классификация помогает определить, где они хранятся, что собой представляют и для каких операций применяются.
✔️ Логические
Этот тип данных основан на логике и может иметь два значения: false (ложь) или true (правда). В языках С# и C++ это bool, а в Java — boolean.
✔️ Целочисленные
Виды данных в программировании делят на знаковые и беззнаковые. В первых хранятся действительные числа и ноль, а во вторых — только больше нуля.
У беззнаковых данных диапазон в два раза больше, чем у знаковых. Это происходит из-за компьютерного восприятия. В знаковых типах бит отражает знак числа, где ноль — положительное значение, а единица — отрицательное.
Учитывая восприятие компьютерными устройствами целого значения, в ячейке памяти из n бит может храниться и 2n-1 для знаковых типов, и 2n — для беззнаковых.
Еще одна классификация типов данных:
- Тип short, или короткий целый. Занимает в ячейке памяти 16 бит, то есть 2 байта (216 = 65 536).
- Тип long. Ему отводится 64 бита = 8 байт (264 = 1,8 446 744 * 1019).
✔️ Числа с плавающей запятой
Плавающая запятая — форма представления действительных чисел, где число хранится в форме мантиссы и показателя степени. Если говорить на языке программирования, то каждое число может быть представлено в следующей форме:
где X — записываемое число;
Например: 1 592 916 = 1,592 916 ∗ 10 6 ; 0,00027,459 = 27,459 ∗ 10 -5 . На мониторе вы увидите следующие значения:
В предназначенном месте памяти хранится целое число фиксированной длины и последовательность вносимого значения.
✔️ Строковые
Строка string в JavaScript — часть текста или определенный заведомо установленный порядок знаков. Их закавычивают.
Отдельные языки применяют специальный вид данных в программировании, с его помощью заносят символ. Например, в языке С — char.
✔️ Указатели
Указатель — это объект, который хранит определенный адрес в памяти компьютера. Значение указателя — это физический адрес определенных данных: указатель указывает на эти данные.
Получение данных по адресу, который хранится в указателе, называют разыменованием указателя. При создании указателя перед названием переменной добавляют *. Указатель может быть нулевым и не указывать ни на один объект.
✔️ Идентификационные
Конечный набор значений определяет перечисляемый тип. Как правило, его представляет список идентификаторов в объявлении типа.
Разберем пример на языке С++ (в С# и Java — аналогично):
В случае когда идентификатор указывается в списке значений перечисляемого типа, он становится наименованием константы, которая определена в блоке типа.
✔️ Абстрактные
У абстрактного типа данных (АТД) есть преимущества перед остальными типами:
- Инкапсуляция деталей реализации. Инкапсуляция — ограничение доступа к компонентам, составляющим объект. Достаточно один раз инкапсулировать, чтобы пользователь смог самостоятельно взаимодействовать с АТД через интерфейс. Если детали реализаций поменяют, то представления клиентов о работе не изменятся.
- Снижение уровня сложности через абстрагирование от деталей реализации. Это значит, что детали скрывают и сосредотачиваются на ключевых аспектах системы. Так можно сосредоточиться на том, что делает АТД.
- Ограничение области использования данных. Все данные структуры АТД не зависят от других участков кода.
- Высокая информативность интерфейса.
Примеры
- В языке Python используют следующие типы данных программирования:
- int — целочисленный;
- char — символьный;
- bool — логический;
- float — с плавающей запятой;
- double — с плавающей запятой двойной точности.
Освойте Python на курсе от Skypro. Вас ждут 400 часов обучения и практики (достаточно десяти часов в неделю), подготовка проектов для портфолио, индивидуальная проверка домашних заданий и помощь опытных наставников. Получится, даже если у вас нет опыта в IT.
- Язык программирования JavaScript содержит следующие типы данных:
- string — тип данных «строка»;
- number — «число»;
- object — тип данных, хранящий свойства и методы;
- undefined — тип данных, значения которых не определены;
- boolean — логический;
- null — с «пустыми» значениями.
JavaScript можно изучить на курсе Skypro «Веб-разработчик». Программа построена от простого к сложному, в ней много практики. Уже к концу второго блока обучения сможете самостоятельно сделать лендинг с играми на JavaScript.
Самоприменение типов данных
У типа данных может быть особенность параметризации с каким-либо другим типом, но строго подчиненная и соотнесенная с принципами абстракции и параметричности.
Под теорией типов понимают математически формализованную базу, которая служит как для проектирования и анализа, так и для изучения систем типов данных в теории языков программирования. За всё это отвечает специально выделенный раздел в информатике.
Пример. Чтобы функция сортировки последовательностей могла быть реализована, необязательно знать свойства всех элементов, которые ее составляют. Важен допуск операции по сравнению и анализу данных. Тогда параметр «последовательности» станет параметрически полиморфным. Составляющие такого типа будут определяться и использоваться не с конкретными типами, а с параметрами-типами. Но параметрически полиморфный тип может быть представлен как конструктор других любых типов. Он становится оператором над типами в арифметической реальности.
В программировании и информатике есть понятия «отражение», «рефлексивность» или «интроспекция». Они обозначают одно и то же — выявление метатипов в динамике.
Представление в компьютере
Реальное программирование отличается от формальной теории информации. Главное отличие — в изучении вопросов об эффективности.
Отличие заключается в понятии «число». Этот термин в науке об ЭВМ и на практике абсолютно неодинаков. Число на ЭВМ понимается как ячейка электронной памяти. Размер кластера зависит от архитектуры ЭВМ и диапазона значений числа. Он обязательно ограничен, а стоп-объем равен объему ячейки.
Целые и вещественные числа в ячейках представлены по-разному. Положительные или неотрицательные числа представляются непосредственно, а вот существенно отрицательные целые числа — в дополнительном коде.