В Python абсолютно всё является объектом. При этом все типы объектов имеют очень важный отличительный признак: изменяемость. Некоторые объекты в Python являются изменяемыми (англ. mutable), а другие нет (англ. immutable). Это различие зачастую сильно путает начинающих Python-разработчиков, но сейчас мы попробуем устранить это затруднение. Из этой статьи вы узнаете, что собой представляют изменяемые типы данных в Python.
Какими бывают изменения в объектах Python
По сути, изменяемые типы данных в Python — это такие типы данных, значение которых можно изменить in-place (на месте) после их создания.
Это утверждение могло вызвать у вас еще два вопроса: что такое in-place и какие значения можно изменять в изменяемых типах данных. Давайте обсудим каждый из них.
1. Что такое изменение in-place (на месте)?
Под понятием “изменение in-place” мы подразумеваем любое изменение содержимого объекта без создания его отдельной копии. Например, мы можем напрямую добавлять, удалять или обновлять значения списка в Python, не создавая новый список.
lst = [12, 42, 21, 1] lst.append(99) print(lst) lst.extend([99, 88]) print(lst) # Результат: # [12, 42, 21, 1, 99] # [12, 42, 21, 1, 99, 99, 88]
Как видите, мы можем добавлять значения в наш список lst
без необходимости создавать новый. То есть мы перезаписываем исходный список. Это операция in-place (на месте).
2. Какие значения можно изменять в объектах изменяемого типа?
В объектах изменяемого типа мы можем изменять их уже существующие значения, удалять их, а также добавлять новые. По сути, мы можем выполнять любую операцию с данными, не создавая новую копию объекта. То есть значение изменяемого типа, присвоенное любой переменной, может быть изменено.
Изменяемые типы данных в Python
Обычно в Python выделяют три изменяемых типа данных:
- Списки
- Словари
- Множества
Давайте вкратце обсудим каждый из них.
Списки в Python
Список в Python — это упорядоченная последовательность элементов, которая может быть изменена. Это означает, что мы можем изменить список, заменяя, добавляя и удаляя элементы. И для всего этого нам не нужно создавать новую копию уже существующего списка. Рассмотрим ниже несколько примеров.
Пример 1:
# пример, демонстрирующий, что список является изменяемым типом данных в python # наш текущий список my_list = [1,2,3,4,5] # операция добавления в список my_list.append(10) # вывод результата в консоль print("List after appending a value = ", my_list) # операция расширения списка (добавление нескольких элементов) my_list.extend([6,11,23]) # вывод результатов в консоль print("List after extending a list = ", my_list) # удаление элемента списка my_list.remove(3) # вывод результатов в консоль print("List after removing a value = ", my_list)
Результат:
List after appending a value = [1, 2, 3, 4, 5, 10] List after extending a list = [1, 2, 3, 4, 5, 10, 6, 11, 23] List after removing a value = [1, 2, 4, 5, 10, 6, 11, 23]
Объяснение. Мы показали возможность добавлять и удалять элементы из существующего списка:
- Сначала мы создаем произвольный список
- Затем мы добавляем элемент в наш список и выводим его в консоль
- Далее расширяем наш список сразу на несколько элементов и удаляем определенные элементы
Все выполненные изменения были отражены в результатах работы кода. Таким образом, мы можем заключить, что списки в Python являются изменяемыми.
Мы также можем изменить значения элементов списка, используя оператор присваивания. Например, рассмотрим следующий код:
my_list = [1,2,3,4,5] my_list[4] = 100 print("List after changing value using indexing = ", my_list) # Результат: # List after changing value using indexing = [1, 2, 3, 4, 100]
Объяснение: мы изменили значение элемента нашего списка при помощи оператора индекса.
Множества в Python
Множество — это неупорядоченная коллекция элементов в Python. Все элементы множества носят уникальный характер, то есть в нем нет дубликатов. Также элементы множества носят неизменяемый характер, то есть изменять элементы нельзя.
Однако сами множества в Python являются изменяемыми. Это означает, что мы можем добавлять или удалять элементы из них.
Вот несколько примечательных моментов, касающихся изменяемости множеств в Python:
- Поскольку множества по своей природе неупорядочены, мы не можем применять к ним индексацию
- Мы не можем использовать операторы индекса или операторы среза для извлечения (доступа) или изменения элементов множества, на самом деле сам тип данных set не поддерживает такие операции
- Однако мы можем добавлять или удалять любой элемент и обновлять множество. Добавление элементов можно выполнить с помощью метода
add()
. Операции обновления можно выполнять с помощью методаupdate()
. Для удаления элементов из множества используется методremove()
.
Для наглядности давайте рассмотрим несколько примеров:
# пример, демонстрирующий, что множества является изменяемым типом данных # наше текущее множество my_set = {1,2,6,5,7,11} # добавляем элемент в наше множество my_set.add(16) # выводим результат в консоль print("Set after adding a value : ",my_set) # добавляем несколько элементов в наше множество my_set.update([9,78,100]) # выводим результат в консоль print("Set after updating some values : ",my_set) # удаляем элемент из нашего множества my_set.remove(2) # выводим результат в консоль print("Set after removing a value : ",my_set)
Результат:
Set after adding a value : {1, 2, 5, 6, 7, 11, 16} Set after updating some values : {1, 2, 100, 5, 6, 7, 9, 11, 78, 16} Set after removing a value : {1, 100, 5, 6, 7, 9, 11, 78, 16}
Объяснение. В приведенном выше примере мы добавили и удалили некоторые значения из нашего множества. Обратите внимание, что результат каждый раз находится в неупорядоченном виде. Это основная причина, по которой мы не можем использовать индексирование для изменения произвольного элемента множества: положение любого элемента не является фиксированным.
Удалить элементы из множества можно также при помощи методов pop()
и clear()
. В последнем случае будут удалены все элементы.
Словари в Python
Словарь в Python — это неупорядоченный набор элементов. Каждый элемент словаря представляет собой пару ключ-значение. По ключу мы можем получить доступ к определенному значению. Ключи в словарях уникальны по своей природе.
Примечание редакции: о поиске ключей словаря по значениям читайте в статье “Как получить ключ по значению в словаре в Python”.
Словарь в Python — это изменяемый тип данных. Это означает, что мы можем добавлять и удалять элементы из словаря, а также менять их значения, используя оператор присваивания.
Добавление элементов может быть выполнено при помощи ключей словаря. Если элемент с таким ключом уже присутствует, то будет просто обновляться его значение. Удаление элементов из словаря можно выполнить при помощи функций pop()
, popitem()
, clear()
или del()
.
Давайте рассмотрим несколько примеров:
# пример, демонстрирующий, что словари являются изменяемым типом данных в Python # наш текущий словарь my_dict = {"state":"WB", "Capital":"Kolkata"} # добавляем в словарь новую пару ключ-значение my_dict['Country'] = "India" # вывод результата в консоль print("Dictionary after adding a new key-value pair = ",my_dict) # обновляем пару ключ-значение my_dict['state'] = "West Bengal" # выводим результаты в консоль print("Dictionary after updating an existing key value pair = ",my_dict) # удаляем пару ключ-значение my_dict.pop('Capital') # выводим результаты в консоль print("Dictionary after popping out a key value pair = ",my_dict) # удаляем все пары ключ-значения my_dict.clear() print("After clearing the whole dictionary = ",my_dict)
Результат:
Our original dictionary = {'state': 'WB', 'Capital': 'Kolkata'} Dictionary after adding a new key value pair = {'state': 'WB', 'Capital': 'Kolkata', 'Country': 'India'} Dictionary after updating an existing key value pair = {'state': 'West Bengal', 'Capital': 'Kolkata', 'Country': 'India'} Dictionary after popping out a key value pair = {'state': 'West Bengal', 'Country': 'India'} After clearing the whole dictionary = {}
Объяснение. В приведенном выше примере мы выполнили такие операции, как добавление, обновление и удаление элементов из нашего словаря. Это доказывает, что словарь является изменяемым типом данных в Python.
Сравнение изменяемых и неизменяемых объектов
Ранее в этой статье мы показали, что содержимое объектов изменяемого типа данных в Python можно менять, присваивая новые значения существующим элементам или просто добавляя новые. И напротив, менять содержимое объектов неизменяемого типа данных в Python нельзя.
Прежде чем обозначить различия между ними, давайте сначала вкратце рассмотрим неизменяемые объекты в Python.
Проще говоря, значение неизменяемого типа, присвоенное переменной, не может быть изменено. Например, строка (string) — это неизменяемый тип данных в Python. Мы не можем изменить ее содержимое, а если попытаемся, то получим ошибку TypeError. Чтобы присвоить строке новое значение, нужно создать новый объект данного типа.
Python обрабатывает изменяемые и неизменяемые объекты совершенно по-разному. Давайте рассмотрим различия между этими типами объектов:
Изменяемые объекты | Неизменяемые объекты |
---|---|
Изменяемый объект может быть изменен после его создания | Неизменяемый объект не может быть изменен после его создания |
Примеры: список, набор, словарь | Примеры: кортежи, целое число (int), число с плавающей запятой (float), логическое значение (bool), frozenset. |
Изменяемые объекты не считаются потокобезопасными по своей сути | Неизменяемые объекты считаются потокобезопасными по своей сути |
Доступ к изменяемым объектам медленнее по сравнению с неизменяемыми | Доступ к неизменяемым объектам быстрее, чем к изменяемым |
Изменяемые объекты полезны, когда нам нужно изменять размер или содержимое нашего объекта | Неизменяемые объекты лучше всего подходят, когда мы уверены, что нам не понадобится их изменять |
Изменение изменяемых объектов — более дешевая операция, чем создание новых, с точки зрения памяти и времени | Изменение неизменяемых объектов — дорогостоящая операция, так как она включает создание новой копии для любых внесенных изменений |
Заключение
Из этой статьи вы узнали, что такое изменяемые типы данных в Python. Давайте вкратце повторим самые важные моменты:
- Объекты в Python могут быть как изменяемыми, так и неизменяемыми.
- Изменяемые типы данных — это такие типы, элементы которых могут быть изменены или им могут быть присвоены новые значения.
- Списки, множества и словари являются примерами изменяемых типов данных в Python.
- Неизменяемые типы данных — это такие типы, значения которых не могут быть изменены после их создания. Примерами неизменяемых типов данных в Python являются типы int (целые числа), str (строки), bool (логический тип данных), float (числа с плавающей запятой), tuple (кортежи) и т. д.
- Мы должны использовать изменяемые объекты всякий раз, когда уверены, что размер наших данных может меняться. И напротив, неизменяемые типы предпочтительнее, когда мы используем данные постоянного размера. Это связано с тем, что внесение изменений в неизменяемый тип данных является дорогостоящей операцией.
Перевод статьи Deepa Pandey “What are Mutable Data Types in Python?”
Пингбэк: Множества в Python: объяснение с примерами