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

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

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

Ответы [ 15 ]

31 голосов
/ 05 августа 2008

Из Python FAQ :

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

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

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

19 голосов
/ 05 августа 2008

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

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

11 голосов
/ 07 августа 2008

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

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

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

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

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

7 голосов
/ 15 августа 2008

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

  • Прагматично, они отлично подходят для упаковки и распаковки ценностей (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 :'(
    
4 голосов
/ 25 июня 2011

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

3 голосов
/ 15 августа 2008

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

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

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

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

откройте консоль и запустите 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' из методов списка.

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

2 голосов
/ 08 августа 2008

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

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

1 голос
/ 31 марта 2018

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

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

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

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

...