Python: в чем разница между (1,2,3) и [1,2,3] и когда я должен использовать каждый?

Во многих случаях (1,2,3) (кортеж) и [1,2,3] (список) могут использоваться как взаимозаменяемые.

Когда я должен использовать тот или иной и почему?

Ответов (17)

Решение

Из FAQ по Python :

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

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

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

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

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

[1, 2, 3] это список, в котором можно добавлять или удалять элементы.
(1, 2, 3) является кортежем, в котором однажды определенное изменение не может быть выполнено.

откройте консоль и запустите python. Попробуй это:

  >>> list = [1, 2, 3]     
  >>> dir(list)
    ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delsli
    ce__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getit
    em__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__',
     '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__r
    educe__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__'
    , '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 
'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

Как вы можете видеть, последний в списке последней строки имеет следующие методы: 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort '

Теперь попробуйте то же самое для кортежа:

>>> tuple = (1, 2, 3)
>>> dir(tuple)
    ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__
    format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__get
    slice__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__
    lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__'
    , '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']

Здесь отображаются только "count" и "index" из методов списка.

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

(1,2,3) является кортежем и [1,2,3] списком. Любой из них представляет собой последовательность чисел, но обратите внимание, что кортежи неизменяемы, а список - это изменяемые объекты Python.

[1,2,3] это список.

(1,2,3) является кортежем и неизменяем.

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

Списки (1,2,3) -tuple [1,2,3] -list являются изменяемыми, над которыми могут выполняться различные операции, тогда как кортежи неизменны и не могут быть расширены. Мы не можем добавлять, удалять или обновлять какой-либо элемент из кортежа один раз он создан.

(1,2,3) является кортежем, а [1,2,3] является списком. Кортеж - это неизменяемый объект, а список - изменяемый.

a = (1,2,3) - это неизменяемый кортеж, что означает, что вы не можете ничего добавить в ab = [1,2,3] - это список в python, который является неизменяемым, что означает, что вы можете вносить изменения в 'b' либо удалить или добавить в него числа.

Проще говоря, списки изменяемы, а кортежи - нет. Следовательно, если вы хотите изменить элементы в своей программе, например, добавить, удалить или изменить элементы, используйте список. Но, если вы не хотите, чтобы tat происходил, то есть может быть для установки последовательности в цикле for и т.д., перейдите к кортежу

(1,2,3) и [1,2,3] могут использоваться взаимозаменяемо в редких условиях.

Итак, (1,2,3) является кортежем и неизменен. Любые изменения, которые вы хотите внести, должны перезаписать объект.

[1,2,3] - это список, в который можно добавлять и удалять элементы.

Список имеет больше возможностей, чем кортеж.

Список [1,2,3] динамичный и гибкий, но за эту гибкость приходится платить за скорость.

Кортеж (1,2,3) фиксированный (неизменяемый) и, следовательно, быстрее.

Кортежи - это быстрый \ гибкий способ создания составных типов данных. Списки - это контейнеры для списков объектов.

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

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

`[(1,'Mark',86),(2,'John',34)...]`

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

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

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

В противном случае, если я хочу иметь функцию для изменения значений, я использую список.

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

Понятие кортежей очень выразительно:

  • С прагматической точки зрения они отлично подходят для упаковки и распаковки значений ( x,y=coord).

  • В сочетании со словарями (хеш-таблицами) они позволяют использовать формы сопоставления, которые в противном случае потребовали бы многоуровневой связи. Например, отметьте, что (x, y) найдено.

    // PHP
    if (!isset($found[$x])) {
        $found[$x] = Array();
        $found[$x][$y] = true;
    } else if (!isset($found[$x][$y])) {
        $found[$x][$y] = true;
    }
    
    # Python
    found[(x,y)] = True # parens added for clarity
    
  • Списки следует использовать с ожиданием операций с их содержимым (отсюда и различные упоминания неизменяемости). Кто-то захочет выталкивать, нажимать, сращивать, разрезать, искать, вставлять до, вставлять после и т. Д. Со списком.

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

  • Наконец, списки не хэшируемы, поэтому тип сопоставления со словарями (хеш-таблицы в Perl, ассоциативные массивы в PHP) должен выполняться с помощью кортежей.

    Вот простой пример кортежей и словарей, наконец, вместе:

    """
    couple is a tuple of two people
    doesLike is a dictionary mapping couples to True or False
    """
    couple = "john", "jane"
    doesLike = dict()
    doesLike[couple] = True
    doesLike["jane", "john"] = False # unrequited love :'(