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

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

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

5.08.2008 07:18:55
15 ОТВЕТОВ
РЕШЕНИЕ

Из FAQ по Python :

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

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

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

33
5.08.2008 13:22:43

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

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

21
26.06.2018 21:22:00
для каких операций кортеж быстрее? индексация?
rafak 18.04.2011 12:33:46

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

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

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

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

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

11
22.02.2018 16:46:14
С тонким предостережением, что кортеж должен содержать только другие неизменяемые объекты, которые могут считаться хешируемыми, например: ([], 3)не хэшируемый; ("hi", 3)можно стирать; ( ([], 3), 3)не может быть хэш ( ((), 3), 3)Хашим
Jegschemesch 23.08.2008 04:41:37

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

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

2
8.08.2008 06:06:33

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

1
8.08.2008 06:48:52

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

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

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

3
15.08.2008 19:09:11

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

  • Прагматично, они отлично подходят для упаковки и распаковки значений ( 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 :'(
7
15.08.2008 18:00:37

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

4
22.02.2018 16:46:33

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

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

1
9.10.2014 03:25:03

откройте консоль и запустите 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', 'extension', '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
10.10.2015 19:30:36
На sorted(x for x in set(dir(list)).difference(dir(tuple)) if not x.startswith('_'))['append', 'clear', 'copy', 'extend', 'insert', 'pop', 'remove', 'reverse', 'sort']
Chris_Rands 25.09.2018 12:12:20

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

0
19.02.2016 02:15:31

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

0
27.06.2016 20:48:38
  • Кортеж может представлять ключ в словаре, потому что он неизменен.
  • Используйте списки, если у вас есть набор данных, который не требует произвольного доступа.
2
30.05.2017 04:25:25

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

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

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

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

1
31.03.2018 09:14:03

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

0
7.02.2019 10:03:33