В чем разница между кортежем и списком в Python: изменяемость, создание и хешируемость

0
88

Содержание

Краткая памятка по выбору между списком и кортежем в Python

  1. Используйте списки для изменяемых данных.
  2. Используйте кортежи для неизменяемых данных.
  3. Создавайте списки с помощью квадратных скобок [].
  4. Создавайте кортежи с помощью круглых скобок ().
  5. Применяйте кортежи в качестве ключей словарей.
  6. Выбирайте кортежи для более быстрой работы с данными.
  7. Используйте списки для динамических коллекций.
  8. Применяйте кортежи для фиксированных наборов значений.
  9. Помните, что кортежи поддерживают распаковку.
  10. Избегайте попыток изменения кортежа — это вызовет ошибку.
  11. Для добавления элементов в кортеж создавайте новый кортеж.
  12. Для изменения списка используйте методы append, remove, insert.

Что такое списки и кортежи в Python

Что такое кортеж в - изображение номер один
Что такое кортеж в — изображение номер один

Списки (list) и кортежи (tuple) — упорядоченные коллекции для хранения нескольких элементов в одной переменной. Оба типа поддерживают индексацию: каждый элемент получает порядковый номер, начиная с 0.

Обе структуры хранят данные любого типа: числа, строки, вложенные коллекции. Доступ к элементу — через индекс:

  • поддерживают срез (извлечение части элементов);
  • сохраняют порядок добавления;
  • допускают вложенность;
  • позволяют итерацию (перебор в цикле).

Но помимо основных есть и критическое различие, определяющее выбор между ними.

Что из себя представляют кортежи и списки?

Python: коллекции, часть 1/4: классификация, общие подходы и методы, конвертация - изображение номер два
Python: коллекции, часть 1/4: классификация, общие подходы и методы, конвертация — изображение номер два

Кортежи и списки – это встроенные структуры данных. Это контейнеры, в которых можно хранить упорядоченную коллекцию из одного или нескольких элементов.

Кортеж имеет класс «кортеж» (англ. tuple): <class ‘tuple’>. А список имеет класс «список» (list): <class ‘list’>.

Чтобы проверить, к какому классу относится объект, вы всегда можете использовать встроенную функцию type(). Просто передайте в нее нужный вам объект в качестве аргумента. Таким образом можно проверить, является ли этот объект кортежем или списком.

Допустим, вы создали кортеж с именем my_tuple. Проверить его тип можно так:

Сходства между кортежами и списками в Python

Строки, списки, кортежи - презентация онлайн - изображение номер три
Строки, списки, кортежи — презентация онлайн — изображение номер три

Как мы упоминали ранее, кортежи и списки действительно похожи. У них есть общие функции, о которых мы сейчас поговорим.

Кортежи и списки могут хранить несколько элементов в одной переменной

Кортежи, словари, списки в - изображение номер четыре
Кортежи, словари, списки в — изображение номер четыре

Единственное различие заключается в синтаксисе. Создавая кортеж, вы берете элементы в круглые скобки (), тогда как для создания списков используются квадратные [].

Чтобы создать пустой кортеж, вы либо используете круглые скобки сами по себе, либо применяете метод-конструктор tuple().

Для создания пустого списка вы также можете использовать пустые скобки (только квадратные), или вызвать метод-конструктор list().

При создании кортежа из одного элемента не забудьте добавить запятую в конце.

Также, если вы используете метод tuple() при создании кортежа, не забывайте, что для этого нужны двойные круглые скобки.

Если вы не добавите запятую в конце, Python не распознает это как кортеж.

А вот при создании списка из одного элемента не нужно беспокоиться о добавлении запятой.

information = («Jimmy» 50,True,»Kate»,50) # File «<stdin>», line 1 # information = («Jimmy» 50,True,»Kate»,50) # ^ # SyntaxError: invalid syntax my_information = [«Dionysia» 28,True,»Lemonaki»,7,»Python»,False] # File «<stdin>», line 1 # my_information = [«Dionysia» 28,True,»Lemonaki»,7,»Python»,False] # ^ # SyntaxError: invalid syntax

Чтобы проверить длину списка или кортежа и узнать, сколько элементов в нем находится, можно использовать метод len().

В Python и кортежи, и списки поддерживают распаковку

Основы работы с массивами и списками: что нужно знать каждому - изображение номер пять
Основы работы с массивами и списками: что нужно знать каждому — изображение номер пять

По сути, при создании кортежа или списка значения «упаковываются» в одну переменную, как мы упоминали ранее.

Убедитесь, что создаваемых вами переменных столько же, сколько значений внутри кортежа/списка, иначе Python выдаст вам ошибку:

front_end = («html»,»css»,»javascript») content,styling = front_end # Traceback (most recent call last): # File «<stdin>», line 1, in <module> # ValueError: too many values to unpack (expected 2) # или… front_end = («html»,»css»,»javascript») content,styling,interactivity,data = front_end # Traceback (most recent call last): # File «<stdin>», line 1, in <module> # ValueError: not enough values to unpack (expected 4, got 3)

Элементы и списков,и кортежей доступны по индексу

Строки, списки, кортежи - online presentation - изображение номер шесть
Строки, списки, кортежи — online presentation — изображение номер шесть

Как упоминалось ранее, кортежи и списки представляют собой упорядоченные наборы элементов.

Порядок элементов устанавливается при создании списка или кортежа. Он неизменен и сохраняется на протяжении всего срока жизни программы. (Порядок и количество элементов в списке можно изменить, и это мы обсудим чуть ниже. Но сам собой порядок не изменится).

Каждое значение в кортеже и списке имеет уникальный идентификатор, также известный как индекс.

Таким образом, к любому элементу в кортеже или списке можно получить доступ, сославшись на его индекс.

Напомним, что индексация в Python (как и в большинстве языков программирования) начинается с 0. То есть первый элемент имеет индекс 0, второй элемент имеет индекс 1 и так далее.

Чтобы обратиться к конкретному элементу, вы пишете имя кортежа или списка, а затем индекс нужного элемента в квадратных скобках.

ЧИТАТЬ ТАКЖЕ:  Файл занят другим процессом: как снять блокировку и решить ошибку доступа в Python

Теперь, когда мы увидели, насколько кортежи и списки похожи, давайте посмотрим, чем они отличаются.

Главное отличие: изменяемость данных

Python - изображение номер семь
Python — изображение номер семь

Списки поддерживают операции модификации. Вы свободно вставляете новые элементы, убираете существующие, переписываете значения:

Вопросы с собеседований на - изображение номер восемь
Вопросы с собеседований на — изображение номер восемь

Практические последствия того, чем отличается список от кортежа Python:

1. Эффективность использования ресурсов. Кортеж потребляет на 20–30% меньше оперативной памяти. Интерпретатор избегает резервирования дополнительного пространства под будущие модификации.

2. Защита от непреднамеренных ошибок. Кортеж предотвращает случайное изменение критичных данных. Конфигурационные параметры, математические константы, географические координаты остаются стабильными на протяжении выполнения скрипта.

3. Совместимость со словарями. Только неизменяемые объекты годятся для роли ключей. Изменяемость списков исключает такое применение.

Фиксированные данные храните в кортеже. Динамические коллекции требуют списка.

Кортежи, в отличие от списков, неизменяемы

Типы данных в - изображение номер девять
Типы данных в — изображение номер девять

В Python кортежи неизменяемы. Это означает, что после создания кортежа элементы внутри него не могут измениться.

Это также означает, что кортежи имеют фиксированную длину. Она не меняется на протяжении всего жизненного цикла программы.

Как создавать списки и кортежи в Python

Списки и кортежи в - изображение номер десять
Списки и кортежи в — изображение номер десять

Обучение - изображение номер одиннадцать
Обучение — изображение номер одиннадцать

#Одиночный элемент — обязательна завершающая запятая single = (42,) # без запятой интерпретатор видит скобки группировки

Одноэлементный кортеж требует запятой после значения. Python иначе трактует круглые скобки как оператор группировки в математических выражениях, а не маркер типа tuple.

not_tuple = (100) # тип int, скобки игнорируются is_tuple = (100,) # тип tuple благодаря запятой

Количество переменных слева обязано совпадать с числом элементов справа, иначе интерпретатор выбросит ValueError.

Внутреннее устройство: как Python хранит списки и кортежи

PPT - изображение номер двенадцать
PPT — изображение номер двенадцать

Принципиальная разница — в стратегии выделения памяти. Список резервирует место впрок, чтобы минимизировать дорогостоящие операции перераспределения. Размер растёт по формуле: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88…

При вставке девятого элемента в восьмиместный список интерпретатор сразу выделяет 16 позиций. Из них заняты 9, остальные 7 ждут будущих вставок. Метод append() выигрывает в скорости, но расходует больше оперативной памяти.

Web-программирование - изображение номер тринадцать
Web-программирование — изображение номер тринадцать

Кортежи избегают избыточного резервирования — размер точно соответствует числу элементов. Интерпретатор Python применяет агрессивные оптимизации. Пустые кортежи реализованы как синглтон — в процессе живёт единственный экземпляр, все переменные ссылаются на один адрес. Экономия памяти и моментальная инициализация.

Хешируемость: почему кортежи можно использовать как ключи словарей

Что такое хеш-функция и как работают алгоритмы хеширования / - изображение номер четырнадцать
Что такое хеш-функция и как работают алгоритмы хеширования / — изображение номер четырнадцать

Хешируемость — свойство объекта иметь неизменное хеш-значение на протяжении всей жизни. Хеш-функция преобразует объект в целое число фиксированной длины. Python использует хеши для быстрого поиска в словарях и множествах.

Хешируемые типы в Python: int, float, str, bool, frozenset, tuple (если все элементы хешируемы). Нехешируемые: list, dict, set. Пользовательские классы хешируемы по умолчанию — их хеш вычисляется через id() и не меняется.

Словари и множества хранят данные в хеш-таблицах. Когда вы добавляете пару ключ-значение в словарь, Python вычисляет хеш ключа и использует его для определения позиции в памяти. Поиск по хешу выполняется за O(1) — константное время, независимо от размера словаря. Если бы ключи могли меняться, позиция в хеш-таблице стала бы неверной, и поиск сломался бы.

Храните в кортежах составные ключи для словарей — например, координаты точек на карте, комбинации параметров запросов, идентификаторы с метаданными. Кортежи гарантируют, что ключ не изменится случайно и словарь сохранит целостность.

Операции с элементами списка¶

Лабораторная работа 3 - изображение номер пятнадцать
Лабораторная работа 3 — изображение номер пятнадцать

В нашем списке три элемента: «Родители», «Одноклассники», «Лида и Наташа», — которые хранятся внутри списка именно в таком порядке. Если только вы не измените порядок списка, «Родители» всегда будет первым элементом, «Одноклассники» — вторым и «Лида и Наташа» — третьим. Родители представляет собой начало списка, а Лида и Наташа — конец. Мы помним, что Лида и Наташа не смогут прийти, и их нужно удалить из списка.

Но не забываем, нужно еще добавить в список двух гостей. Добавление новых элементов в конец списка происходит при помощи метода append.

В список можно не только добавить элемент, но и изменить одно из его значений на другое, согласно индексу элемента.

И так, список — это контейнер, хранящий объекты в определенном порядке. Обратите внимание, что в отличие от строк, методы списка меняют исходный список. Есть однако у списков кое‑что общее со строками. Это доступ к элементу по индексу и срезы. Все это работает в списках точно так же, как и в строках.

Как изменять списки в Python

Программирование на - изображение номер шестнадцать
Программирование на — изображение номер шестнадцать

Поскольку списки изменяемы, вам необходимо знать несколько основных способов обновления данных в них.

Как обновить элемент в списке в Python

Презентация \ - изображение номер семнадцать
Презентация \ — изображение номер семнадцать

Чтобы обновить конкретный элемент в списке, нужно указать его индекс в квадратных скобках. Затем ему можно присвоить новое значение.

#general syntax list_name[index] = new_value programming_languages = [«Python»,»JavaScript»,»Java»,»C»] print(programming_languages) # [‘Python’, ‘JavaScript’, ‘Java’, ‘C’] programming_languages[2] = «C++» print(programming_languages) # [‘Python’, ‘JavaScript’, ‘C++’, ‘C’]

Как добавить элементы в список в Python

Fundamentals of - изображение номер восемнадцать
Fundamentals of — изображение номер восемнадцать

#general syntax list_name.append(item) programming_languages = [«Python»,»JavaScript»,»Java»,»C»] print(programming_languages) # [‘Python’, ‘JavaScript’, ‘Java’, ‘C’] programming_languages.append(«C++») print(programming_languages) # [‘Python’, ‘JavaScript’, ‘Java’, ‘C’, ‘C++’]

Чтобы добавить один элемент на определенную позицию, используется метод.insert().

Он вставляет элемент в список на конкретное место. Остальные элементы в списке, идущие после, сдвигаются на одну позицию вправо.

Если вы хотите добавить в список более одного элемента, используйте метод.extend().

Он добавляет итерируемый объект в конец списка. Например, вы можете добавить новый список в конец уже существующего.

#general syntax list_name.extend(iterable) programming_languages = [«Python»,»JavaScript»] more_programming_languages = [«Java»,»C»] # add more_programming_languages to programming_languages programming_languages.extend(more_programming_languages) print(programming_languages) # [‘Python’, ‘JavaScript’, ‘Java’, ‘C’]

ЧИТАТЬ ТАКЖЕ:  Python и XML: парсинг, чтение и обработка данных с примерами

Как удалить элементы из списка в Python

Delete a specific object from a list with remove in - изображение номер девятнадцать
Delete a specific object from a list with remove in — изображение номер девятнадцать

#general syntax list_name.remove(item) programming_languages = [«Python», «JavaScript», «Java», «C»] print(programming_languages) # [‘Python’, ‘JavaScript’, ‘Java’, ‘C’] programming_languages.remove(«Java») print(programming_languages) # [‘Python’, ‘JavaScript’, ‘C’] # deletes only first occurence programming_languages = [«Python», «JavaScript», «Java», «C»,»Python»] programming_languages.remove(«Python») print(programming_languages) # [‘JavaScript’, ‘Java’, ‘C’, ‘Python’]

Также можно передать в pop() в качестве аргумента индекс конкретного элемента, который необходимо удалить.

В обоих случаях удаленное значение возвращается, что полезно. При желании вы можете сохранить его в отдельной переменной для дальнейшего использования.

programming_languages = [«Python», «JavaScript», «Java», «C»] programming_languages.pop() # ‘C’ print(programming_languages) # [‘Python’, ‘JavaScript’, ‘Java’] # store returned value in a variable programming_languages = [«Python», «JavaScript», «Java», «C»] fave_language = programming_languages.pop(0) print(fave_language) # Python

Сложение кортежей и списков¶

Москва, 2026 - изображение номер двадцать
Москва, 2026 — изображение номер двадцать

При помощи оператора сложения можно соединять друг с другом две одинаковые структуры данных. Пример ниже со списками также будет работать и с кортежами:

На данном этапе вам может стать интересно, зачем использовать структуры данных, которые кажутся менее гибкими, чем списки? На самом же деле, кортежи удобны, когда вы имеете дело со значениями, которые никогда не изменятся. Примером таких данных для кортежа могут быть географические координаты. Долготу и широту города следует сохранить в кортеже, поскольку эти значения никогда не изменятся, а сохранение в кортеже будет гарантировать, что другие части программы случайно их не изменят.

Итерирование¶

Методическая разработка урока \ - изображение номер двадцать один
Методическая разработка урока \ — изображение номер двадцать один

Строки, списки и кортежи поддерживают итерирование (программа может их перебирать, значение за значением), то есть к каждому их элементу можно получить доступ через цикл — такие объекты называются итерируемыми. Каждый элемент в итерируемом объекте, как мы уже знаем, имеет свой порядковый индекс.

В следующем примере элемент Москва записан в списке с индексом 0, Хельсинки с индексом 1, а ‘Анкара’ с индексом 2.

Вот мы и познакомились с оператором for — циклом, перебирающим итерируемый объект. Цикл for можно использовать, чтобы определять инструкции, которые будут выполняться один раз для каждого элемента в итерируемом объекте, и с помощью таких инструкций вы можете получать доступ ко всем этим элементам и осуществлять операции с ними.

Например, с помощью цикла for, выполняющего перебор списка строк, и метода upperможно сделать символы каждой строки прописными:

Как показано в примерах выше, цикл for определяется синтаксисом: for имя_переменной in имя_итерируемого_объекта:где имя_переменной — выбранное вами имя переменной, в которую каждую итерацию цикла будет записываться очередное значение из итерируемого объекта.

Когда использовать список, а когда кортеж

Типы данных - изображение номер двадцать два
Типы данных — изображение номер двадцать два
  • данные будут изменяться (добавление, удаление, сортировка);
  • работаете с динамическими коллекциями (список задач, история операций);
  • нужны встроенные методы изменения (append, remove, sort).
  • данные фиксированы и не должны меняться (координаты, настройки, константы);
  • нужен ключ для словаря или элемент множества;
  • важна производительность и экономия памяти при больших объёмах;
  • передаёте неизменяемый набор параметров в функцию.

В чем отличие списка от кортежа в python - изображение номер двадцать три
В чем отличие списка от кортежа в python — изображение номер двадцать три

#Возврат нескольких значений из функции def get_user_info(): return (‘Пётр’, 28, ‘developer’) name, age, role = get_user_info()

  1. Данные изменятся в процессе работы? → список.
  2. Нужна защита от случайного изменения? → кортеж.
  3. Используете как ключ словаря? → кортеж.
  4. Производительность критична? → кортеж.
  5. Нужны методы вроде sort() или append()? → список.

Когда использовать кортежи

Python 3 - изображение номер двадцать четыре
Python 3 — изображение номер двадцать четыре

() () ()
Кортеж (tuple) инициализируется при помощи круглых скобок или функции tuple().

Таблица №1

1
2
3
# создадим две переменные и поместим в них пустые кортежи
tuple_1, tuple_2 = (), tuple()
print(tuple_1, tuple_2)

Таблица №2

1
() ()

Во многом кортеж похож на список. Это также упорядоченный набор элементов с индексом, начинающимся с нуля.

Таблица №3

1
2
3
4
5
# создадим кортеж
letters = (‘a’, ‘b’, ‘c’)
 
# и выведем его первый элемент
letters[0]

Таблица №4

1
‘a’

Основное отличие от списка — кортеж неизменяем. После того как кортеж создан, добавлять или удалять элементы нельзя.

Таблица №5

1
2
# попробуем заменить первый элемент кортежа
letters[0] = ‘d’

Шпаргалка по работе с кортежами в - изображение номер двадцать пять
Шпаргалка по работе с кортежами в — изображение номер двадцать пять

Таблица №6

1
2
3
4
5
6
# преобразуем кортеж в список через функцию list()
letters = list(letters)
 
# теперь элементы можно изменять
letters[0] = ‘d’
letters

Таблица №7

1
[‘d’, ‘b’, ‘c’]

Таблица №8

1
2
let_a = (‘a’, )
type(let_a)

Таблица №9

1
tuple

Таблица №10

1
2
let_a = (‘a’)
type(let_a)

Таблица №11

1
str

Когда использовать списки

С другой стороны, списки можно легко редактировать и модифицировать, потому что они изменяемы.

Вы можете добавлять элементы в список, удалять элементы из списка, перемещать элементы и заменять их.

Это означает, что длина и размер списков увеличивается и уменьшается на протяжении жизненного цикла программы.

Списки полезны, когда вы хотите, чтобы ваши данные были гибкими или чтобы при необходимости их можно было изменить.

В Python есть множество встроенных методов для выполнения разнообразных операций со списками. Использовать эти методы с кортежами не выйдет.

Часто задаваемые вопросы о различиях списков и кортежей в Python

Вопрос: В чем основное отличие списка от кортежа в Python?
Ответ: Основное отличие в том, что списки изменяемы (можно добавлять, удалять и изменять элементы), а кортежи — неизменяемы.

Вопрос: Можно ли изменить элемент кортежа после его создания?
Ответ: Нет, кортежи являются неизменяемыми структурами данных, поэтому изменить их элементы напрямую нельзя.

Вопрос: Какой синтаксис используется для создания списка?
Ответ: Список создается с помощью квадратных скобок [], например: my_list = [1, 2, 3].

Вопрос: Какой синтаксис используется для создания кортежа?
Ответ: Кортеж создается с помощью круглых скобок (), например: my_tuple = (1, 2, 3).

Вопрос: Можно ли использовать кортеж в качестве ключа словаря?
Ответ: Да, кортежи можно использовать как ключи словаря, так как они хешируемы (неизменяемы). Списки для этой цели не подходят.

Вопрос: Что быстрее в Python: список или кортеж?
Ответ: Кортежи обычно немного быстрее списков при создании и доступе к элементам, так как они имеют более простую внутреннюю структуру.

Вопрос: Когда лучше использовать список вместо кортежа?
Ответ: Список лучше использовать, когда данные могут изменяться в процессе работы программы (например, динамический список задач).

Вопрос: Когда лучше использовать кортеж вместо списка?
Ответ: Кортеж лучше использовать для хранения фиксированных наборов данных (например, координаты точки или дни недели).

Вопрос: Поддерживают ли кортежи распаковку?
Ответ: Да, кортежи, как и списки, поддерживают распаковку, что позволяет присваивать их элементы отдельным переменным.

Вопрос: Можно ли добавить элемент в кортеж?
Ответ: Напрямую нет, но можно создать новый кортеж, объединив существующий с другим кортежем с помощью оператора +.