В чем разница между списками и кортежами?
Вопрос: В чем разница между списками и кортежами в Python, а также каковы их преимущества и недостатки?
Я изучаю Python и столкнулся с вопросом выбора между списками и кортежами. Хотел бы понять, в чем основные отличия между этими типами данных. Какие у них есть преимущества и недостатки в использовании? Когда лучше использовать список, а когда кортеж? Спасибо!
5 ответ(ов)
Различия между списком и кортежем
Литеральное представление
someTuple = (1, 2) someList = [1, 2]
Размер
a = tuple(range(1000)) b = list(range(1000)) a.__sizeof__() # 8024 b.__sizeof__() # 9088
Из-за меньшего размера кортежа операции с ним немного быстрее, но это имеет значение только при большом количестве элементов.
Разрешенные операции
b = [1, 2] b[0] = 3 # [3, 2] a = (1, 2) a[0] = 3 # Ошибка
Это также означает, что вы не можете удалить элемент или отсортировать кортеж. Тем не менее, вы можете добавить новый элемент как в список, так и в кортеж, с единственным отличием: поскольку кортеж неизменяемый, вы не действительно добавляете элемент, а создаете новый кортеж, поэтому его идентификатор изменится.
a = (1, 2) b = [1, 2] id(a) # 140230916716520 id(b) # 748527696 a += (3,) # (1, 2, 3) b += [3] # [1, 2, 3] id(a) # 140230916878160 id(b) # 748527696
Использование
Поскольку список изменяемый, его нельзя использовать в качестве ключа в словаре, тогда как кортеж можно.
a = (1, 2) b = [1, 2] c = {a: 1} # ОК c = {b: 1} # Ошибка
Если вы пошли на прогулку, вы можете зафиксировать свои координаты в любой момент времени в виде кортежа (x,y)
.
Если вы хотите записать своё путешествие, вы можете добавлять своё местоположение в список каждые несколько секунд.
Однако вы не могли бы сделать это наоборот.
Ключевое отличие заключается в том, что кортежи (tuples) являются неизменяемыми (immutable). Это означает, что вы не можете изменять значения в кортеже после его создания.
Если вам нужно изменять значения, используйте список (list).
Преимущества кортежей:
- Небольшое улучшение производительности.
- Поскольку кортеж является неизменяемым, его можно использовать в качестве ключа в словаре (dictionary).
- Если вы не можете изменить кортеж, то и никто другой не сможет, что означает, что вам не нужно беспокоиться о том, что функции API могут изменить ваш кортеж без вашего ведома.
Списки изменяемы, тогда как кортежи — нет.
Согласно документации Python, кортежи являются неизменяемыми и обычно содержат разнородную последовательность элементов, доступ к которым можно получить через распаковку (об этом будет сказано позже в разделе) или индексирование (или даже по атрибутам в случае именованных кортежей). Списки же изменяемы, и их элементы обычно однородны, к ним осуществляется доступ путем итерации по списку.
Это пример списков в Python:
my_list = [0, 1, 2, 3, 4]
top_rock_list = ["Bohemian Rhapsody", "Kashmir", "Sweet Emotion", "Fortunate Son"]
Это пример кортежей в Python:
my_tuple = (a, b, c, d, e)
celebrity_tuple = ("John", "Wayne", 90210, "Actor", "Male", "Dead")
Списки и кортежи в Python похожи тем, что оба являются упорядоченными коллекциями значений. Основное различие заключается в том, что элементы кортежа неизменяемы (immutable), в то время как элементы списка изменяемы (mutable). Это отличие влияет на то, как они могут использоваться (что предопределено синтаксисом) и как программисты предпочитают их использовать (в соответствии с «лучшей практикой»). Главное отличие в использовании кортежей и списков заключается в том, какое значение придаётся порядку элементов.
В случае кортежей 'порядок' обозначает просто определённую 'структуру' для хранения информации. Значения, находящиеся в первом поле, можно легко заменить на значения во втором поле, так как каждый из них предоставляет значения по двум различным измерениям или шкалам. Кортежи дают ответы на различные типы вопросов и обычно имеют форму: какие атрибуты у данного объекта/темы? Объект/тема остаётся постоянным, атрибуты меняются.
В случае списков 'порядок' обозначает последовательность или направленность. Второй элемент ДОЛЖЕН идти после первого элемента, потому что он занимает 2-е место в зависимости от определённой общей шкалы или измерения. Элементы воспринимаются в целом и, как правило, предоставляют ответы на один вопрос, который обычно имеет форму: как эти объекты/темы сравниваются по данному атрибуту? Атрибут остаётся постоянным, объект/тема меняются.
Существуют множество примеров людей из популярной культуры и программистов, которые не придерживаются этих различий, и множество людей, которые могут использовать салатную вилку для основного блюда. В конечном итоге, это нормально, и обе структуры, как правило, выполняют свою функцию.
В кратце о некоторых нюансах
Сходства:
Дубликаты - Как кортежи, так и списки допускают дубликаты.
Индексация, выбор и нарезка - Индексация в кортежах и списках осуществляется с использованием целочисленных значений в квадратных скобках. Например, чтобы получить первые 3 значения из списка или кортежа, синтаксис будет одинаковым:
>>> my_list[0:3] [0, 1, 2] >>> my_tuple[0:3] [a, b, c]
Сравнение и сортировка - Два кортежа или два списка сравниваются по первому элементу, если есть равенство, то по второму элементу, и так далее. Дальнейшие элементы не учитываются после того, как ранее элементы показали различия.
>>> [0, 2, 0, 0, 0, 0] > [0, 0, 0, 0, 0, 500] True >>> (0, 2, 0, 0, 0, 0) > (0, 0, 0, 0, 0, 500) True
Различия: - По определению
Синтаксис - Для списков используются квадратные скобки [], для кортежей - круглые скобки ().
Изменяемость - Элементы данного списка изменяемы, элементы данного кортежа НЕ изменяемы.
# Списки изменяемы: >>> top_rock_list ['Bohemian Rhapsody', 'Kashmir', 'Sweet Emotion', 'Fortunate Son'] >>> top_rock_list[1] 'Kashmir' >>> top_rock_list[1] = "Stairway to Heaven" >>> top_rock_list ['Bohemian Rhapsody', 'Stairway to Heaven', 'Sweet Emotion', 'Fortunate Son'] # Кортежи НЕ изменяемы: >>> celebrity_tuple ('John', 'Wayne', 90210, 'Actor', 'Male', 'Dead') >>> celebrity_tuple[5] 'Dead' >>> celebrity_tuple[5] = "Alive" Traceback (последний вызов последнего): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment
Хеш-таблицы (Словари) - Так как хеш-таблицы (словари) требуют, чтобы их ключи были хешируемыми и, следовательно, неизменяемыми, только кортежи могут выступать в качестве ключей словарей, а не списки.
# Списки НЕ могут выступать в качестве ключей для хеш-таблиц (словари) >>> my_dict = {[a, b, c]: "some value"} Traceback (последний вызов последнего): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list' # Кортежи могут выступать в качестве ключей для хеш-таблиц (словари) >>> my_dict = {("John", "Wayne"): 90210} >>> my_dict {('John', 'Wayne'): 90210}
Различия - A posteriori, в использовании
- Однородность против неоднородности элементов - Обычно объекты списка однородны, а объекты кортежа - неоднородны. То есть списки используются для объектов/тем, одного типа (например, все кандидаты в президенты, все песни или все бегуны), тогда как кортежи более подходят для неоднородных объектов.
- Циклы против структур - Хотя оба типа допускают циклы (например, for x in my_list...), это имеет смысл только для списков. Кортежи более подходят для структурирования и представления информации (например, "%s %s проживает в %s, это %s и в данный момент %s" % ("John", "Wayne", 90210, "Actor", "Dead")).
Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе
Почему используется string.join(list), а не list.join(string)?
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Как вернуть ключи словаря в виде списка в Python?
Как преобразовать строковое представление списка в список?