В чем разница между списками и кортежами? - PullRequest
941 голосов
/ 09 марта 2009

Какая разница?

Каковы преимущества / недостатки кортежей / списков?

Ответы [ 18 ]

7 голосов
/ 19 июля 2018

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

Кортежи и списки в Python кажутся одинаковыми типами последовательностей.

  1. Буквальный синтаксис

    Мы используем скобки () для построения кортежей и квадратных скобок [ ], чтобы получить новый список. Также мы можем использовать вызов соответствующего типа, чтобы получить требуемую структуру - кортеж или список.

    someTuple = (4,6)
    someList  = [2,6] 
    
  2. Изменчивость

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

  3. Использование памяти

    Из-за изменчивости вам нужно больше памяти для списков и меньше памяти для кортежей.

  4. Удлинение

    Вы можете добавить новый элемент в кортежи и списки с той лишь разницей, что будет изменен идентификатор кортежа (т. Е. У нас будет новый объект).

  5. Хеширование

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

    tup      = (1,2)
    list_    = [1,2] 
    
    c = {tup   : 1}     # ok
    c = {list_ : 1}     # error
    
  6. Семантика

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

4 голосов
/ 18 мая 2018

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

Если tuple содержит list или dictionary внутри него, их можно изменить, даже если сам tuple неизменен.

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

my_tuple = (10,20,30,[40,50],{ 'a' : 10})

мы можем изменить содержимое списка как

my_tuple[3][0] = 400
my_tuple[3][1] = 500

, что делает новый кортеж похожим на

(10, 20, 30, [400, 500], {'a': 10})

мы также можем изменить словарь внутри кортежа как

my_tuple[4]['a'] = 500

, из-за чего весь кортеж будет выглядеть как

(10, 20, 30, [400, 500], {'a': 500})

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

Таким образом, tuple остается неизменным без каких-либо исключений

3 голосов
/ 22 сентября 2016

PEP 484 - Тип подсказки говорит, что типы элементов tuple могут быть набраны индивидуально; так что вы можете сказать Tuple[str, int, float]; но list с классом List может принимать только один параметр типа: List[str], что указывает на то, что различие между 2 в действительности состоит в том, что первый является неоднородным, а последний по сути однородным.

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

2 голосов
/ 26 сентября 2017

Указание направления из документации на 5.3. Кортежи и последовательности :

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

1 голос
/ 08 апреля 2016

Прежде всего, они оба являются нескалярными объектами (также известными как составные объекты) в Python.

  • Кортежи, упорядоченная последовательность элементов (которая может содержать любой объект без проблем с наложением)
    • Неизменный (кортеж, int, float, str)
    • Конкатенация с использованием + (конечно, будет создан новый кортеж)
    • Индексация
    • Нарезка
    • Синглтон (3,) # -> (3) вместо (3) # -> 3
  • Список (Массив на других языках), упорядоченная последовательность значений
    • Mutable
    • Синглтон [3]
    • Клонирование new_array = origin_array[:]
    • Понимание списка [x**2 for x in range(1,7)] дает вам [1,4,9,16,25,36] (не читается)

Использование списка также может вызвать ошибку псевдонимов (два разных пути указывая на один и тот же объект).

0 голосов
/ 30 сентября 2014

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

Когда вы создаете переменную, некоторая фиксированная память назначается переменной. Если это список, то выделяется больше памяти, чем фактически используется. Например. если текущее назначение памяти составляет 100 байт, когда вы хотите добавить 101-й байт, возможно, будет назначено еще 100 байт (всего 200 байт в этом случае)

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

0 голосов
/ 21 июня 2018

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

0 голосов
/ 21 июня 2017

Списки изменчивы, а кортежи неизменны. Просто рассмотрите этот пример.

a = ["1", "2", "ra", "sa"]    #list
b = ("1", "2", "ra", "sa")    #tuple

Теперь измените значения индекса списка и кортежа.

a[2] = 1000
print a     #output : ['1', '2', 1000, 'sa']
b[2] = 1000
print b     #output : TypeError: 'tuple' object does not support item assignment.

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

...