Что такое изменяемые типы данных в Python

В 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 выделяют три изменяемых типа данных:

  1. Списки
  2. Словари
  3. Множества

Давайте вкратце обсудим каждый из них.

Списки в 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?”

1 комментарий к “Что такое изменяемые типы данных в Python”

  1. Пингбэк: Множества в Python: объяснение с примерами

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *