11

В чем разница между списками и кортежами?

10

Вопрос: В чем разница между списками и кортежами в Python, а также каковы их преимущества и недостатки?

Я изучаю Python и столкнулся с вопросом выбора между списками и кортежами. Хотел бы понять, в чем основные отличия между этими типами данных. Какие у них есть преимущества и недостатки в использовании? Когда лучше использовать список, а когда кортеж? Спасибо!

5 ответ(ов)

4

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

  1. Литеральное представление

    someTuple = (1, 2)
    someList  = [1, 2]
    
  2. Размер

    a = tuple(range(1000))
    b = list(range(1000))
    
    a.__sizeof__() # 8024
    b.__sizeof__() # 9088
    

    Из-за меньшего размера кортежа операции с ним немного быстрее, но это имеет значение только при большом количестве элементов.

  3. Разрешенные операции

    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
    
  4. Использование

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

    a = (1, 2)
    b = [1, 2]
    
    c = {a: 1}     # ОК
    c = {b: 1}     # Ошибка
    
2

Если вы пошли на прогулку, вы можете зафиксировать свои координаты в любой момент времени в виде кортежа (x,y).

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

Однако вы не могли бы сделать это наоборот.

0

Ключевое отличие заключается в том, что кортежи (tuples) являются неизменяемыми (immutable). Это означает, что вы не можете изменять значения в кортеже после его создания.

Если вам нужно изменять значения, используйте список (list).

Преимущества кортежей:

  1. Небольшое улучшение производительности.
  2. Поскольку кортеж является неизменяемым, его можно использовать в качестве ключа в словаре (dictionary).
  3. Если вы не можете изменить кортеж, то и никто другой не сможет, что означает, что вам не нужно беспокоиться о том, что функции API могут изменить ваш кортеж без вашего ведома.
0

Списки изменяемы, тогда как кортежи — нет.

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

0

Это пример списков в 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-е место в зависимости от определённой общей шкалы или измерения. Элементы воспринимаются в целом и, как правило, предоставляют ответы на один вопрос, который обычно имеет форму: как эти объекты/темы сравниваются по данному атрибуту? Атрибут остаётся постоянным, объект/тема меняются.

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

В кратце о некоторых нюансах

Сходства:

  1. Дубликаты - Как кортежи, так и списки допускают дубликаты.

  2. Индексация, выбор и нарезка - Индексация в кортежах и списках осуществляется с использованием целочисленных значений в квадратных скобках. Например, чтобы получить первые 3 значения из списка или кортежа, синтаксис будет одинаковым:

    >>> my_list[0:3]
    [0, 1, 2]
    >>> my_tuple[0:3]
    [a, b, c]
    
  3. Сравнение и сортировка - Два кортежа или два списка сравниваются по первому элементу, если есть равенство, то по второму элементу, и так далее. Дальнейшие элементы не учитываются после того, как ранее элементы показали различия.

    >>> [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
    

Различия: - По определению

  1. Синтаксис - Для списков используются квадратные скобки [], для кортежей - круглые скобки ().

  2. Изменяемость - Элементы данного списка изменяемы, элементы данного кортежа НЕ изменяемы.

    # Списки изменяемы:
    >>> 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
    
  3. Хеш-таблицы (Словари) - Так как хеш-таблицы (словари) требуют, чтобы их ключи были хешируемыми и, следовательно, неизменяемыми, только кортежи могут выступать в качестве ключей словарей, а не списки.

    # Списки НЕ могут выступать в качестве ключей для хеш-таблиц (словари)
    >>> 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, в использовании

  1. Однородность против неоднородности элементов - Обычно объекты списка однородны, а объекты кортежа - неоднородны. То есть списки используются для объектов/тем, одного типа (например, все кандидаты в президенты, все песни или все бегуны), тогда как кортежи более подходят для неоднородных объектов.
  2. Циклы против структур - Хотя оба типа допускают циклы (например, for x in my_list...), это имеет смысл только для списков. Кортежи более подходят для структурирования и представления информации (например, "%s %s проживает в %s, это %s и в данный момент %s" % ("John", "Wayne", 90210, "Actor", "Dead")).
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь