Python: Различия между списками и кортежами

В этом руководстве вы узнаете различия между списками и кортежами в Python. Списки и кортежи являются основными структурами данных-контейнерами в Python. На первый взгляд они кажутся очень похожими. Однако между ними существует ряд уникальных отличий, которые делают их использование весьма очевидным.

К концу этого урока вы узнаете:

  • Каковы ключевые различия и сходства между списками Python и кортежами Python?

  • Когда использование списка более целесообразно, чем использование кортежа

  • Когда использование кортежа более целесообразно, чем использование списка

  • Какие методы доступны и недоступны для двух структур данных

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

Оглавление

Ключевые различия между списками Python и кортежами Python

В таблице ниже представлены ключевые различия и сходства между списками и кортежами Python. Некоторые из пунктов будут верны как для списков, так и для кортежей, в то время как у других будут отмечены различия:

Атрибут
Список Python
Кортеж Python

Синтаксис

Создано с использованием квадратных скобок: []

Создано с использованием обычных круглых скобок: ()

Элементы можно изменять, удалять или добавлять в

Элементы не могут быть изменены (примечание в разделе об изменении)

Да

Да

Да

Да

Размер/Длина

Размер и длину можно изменить

Размер и длина фиксируются после создания.

Потребление памяти

Повышенное потребление памяти

Меньшее потребление памяти

Возможность копирования

Могут быть созданы копии

Любая «копия» будет указывать непосредственно на оригинал.

Может использоваться как ключи словаря.

Нет

Да

Перебор элементов

Может быть немного медленнее, чем кортежи

Может быть немного быстрее, чем списки

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

Создание и индексирование списков и кортежей Python

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

Давайте посмотрим, как можно создать эти два типа данных:

# Creating Python Lists and Tuples
a_list = ['datagy', 1, True]
a_tuple = ('datagy', 1, True)

Поскольку оба этих объекта упорядочены, мы можем получать доступ к элементам внутри них, используя их индексную позицию. Работают как положительные, так и отрицательные индексы.

Давайте попробуем получить доступ к небольшому количеству данных в них:

# Accessing items in Python Lists and Tuples by their Index Position
print(a_list[0])
print(a_tuple[-1])

# Returns:
# datagy
# True

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

Изменяемость списков и кортежей Python

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

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

Давайте посмотрим, как мы можем изменить значение в списке Python:

# Modifying a Python List's Values
a_list = ['datagy', 1, True]
a_list[2] = False
print(a_list)

# Returns: ['datagy', 1, False]

Давайте посмотрим, что произойдет, когда мы попытаемся сделать то же самое с нашими кортежами:

# Attempting to modify a tuple's value
a_tuple = ('datagy', 1, True)
a_tuple[2] = False
print(a_tuple)

# Raises: TypeError: 'tuple' object does not support item assignment

При попытке изменить значения кортежа была вызвана ошибка.

Существует одно важное исключение. Если наш кортеж содержит изменяемый объект, такой как список, то этот объект может быть модифицирован. Давайте посмотрим, как это выглядит:

# Modifying a mutable item in a tuple
another_tuple = (1,2,[3,4])
another_tuple[2].append(5)

print(another_tuple)

# Returns: (1, 2, [3, 4, 5])

Потребление памяти списками и кортежами Python

Поскольку списки в Python являются изменяемыми, а кортежи в Python нет, Python может более эффективно использовать память при работе с кортежами.

Причина этого заключается в том, что при создании списка Python выделяет дополнительное пространство, чтобы иметь возможность его изменять. С другой стороны, в случае с кортежами Python, Python точно знает, сколько памяти нужно выделить!

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

# Checking the sizes of tuples and lists
a_list = ['datagy', 1, True]
a_tuple = ('datagy', 1, True)

print(a_list.__sizeof__())
print(a_tuple.__sizeof__())

# Returns:
# 64
# 48

Мы видим, что список на 33% больше по объему в байтах! На таком уровне это может не иметь большого значения. Однако при работе с большими наборами данных разница может быть огромной.

Сравнение методов списков Python и кортежей

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

Простое сравнение длины таблицы покажет, сколько больше методов доступно для списков по сравнению с кортежами.

Давайте начнем с рассмотрения методов списка в Python:

Методы списка Python

Следующий список содержит все методы, доступные для списков Python:

Метод
Описание

list.append(x)

Добавляет элемент в конец списка.

list.extend(iterable)

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

list.insert(i, x)

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

list.remove(x)

Удаляет первый элемент из списка, значение которого равно x.

list.pop([i])

Удаляет элемент в заданной позиции в списке и возвращает его.

list.clear()

Удаляет все элементы из списка.

list.index(x[, start[, end]])

Возвращает индекс, отсчитываемый от нуля, в списке первого элемента, значение которого равно x.

list.count(x)

Возвращает количество раз, когда x появляется в списке.

list.sort(*, key=None, reverse=False)

Сортирует элементы списка по месту.

list.reverse()

Меняет местами элементы списка.

list.copy()

Возвращает неполную копию списка.

Теперь давайте посмотрим на методы, доступные для кортежей:

Методы кортежа Python

Для кортежей доступны следующие методы:

Метод
Описание

tuple.index(x[, start[, end]])

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

tuple.count(x)

Возвращает количество раз, когда x появляется в кортеже.

Копирование списков и кортежей Python

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

Давайте сначала посмотрим, как это выглядит со списками:

# Making a copy of a list
a_list = ['datagy', 1, True]
another_list = list(a_list)

print(id(a_list))
print(id(another_list))

# Returns:
# 140341145035072
# 140340875289536

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

# Copying tuples
a_tuple = ('datagy', 1, True)
another_tuple = tuple(a_tuple)

print(id(a_tuple))
print(id(another_tuple))

# Returns:
# 140324366994240
# 140324366994240

Заключение

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

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

Дополнительные ресурсы

Чтобы узнать больше о связанных темах, ознакомьтесь с обучающими материалами ниже:

Last updated