Список против кортежа, когда использовать каждый? [Дубликат]

На этот вопрос уже есть ответ:

В Python, когда вы должны использовать списки и когда кортежи?

Иногда у вас нет выбора, например, если у вас есть

"hello %s you are %s years old" % x

, то x должен быть кортежем.

Но если я тот, кто разрабатывает API и может выбирать типы данных, то каковы рекомендации?

401
задан codeforester 30 June 2019 в 18:54
поделиться

6 ответов

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

225
ответ дан 22 November 2019 в 23:24
поделиться

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

  1. Вы не можете добавлять элементы в кортеж . Кортежи не имеют методов добавления или расширения.
  2. Вы не можете удалять элементы из кортежа. Кортежи не имеют методов удаления или извлечения.
  3. Вы можете найти элементы в кортеже, поскольку это не меняет кортеж.
  4. Вы также можете использовать оператор в , чтобы проверить, существует ли элемент в кортеже.

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

  • Это делает ваш код более безопасным, если вы «защищаете от записи» данные это не нужно менять. Использование кортежа вместо списка похоже на наличие подразумеваемого утверждения assert о том, что эти данные являются постоянными, и что требуется особая мысль (и конкретная функция), чтобы переопределить это.

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

Источник: Погрузитесь в Python 3

649
ответ дан 22 November 2019 в 23:24
поделиться

Но если я сам разрабатываю API и получаю возможность выбирать типы данных, тогда каковы рекомендации?

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

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

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

class ThingsKeeper
    def __init__(self):
        self.__things = []

    def things(self):
        return self.__things  #outside objects can now modify your state

    def safer(self):
        return self.__things[:]  #it's copy-on-write, shouldn't hurt performance
11
ответ дан 22 November 2019 в 23:24
поделиться

Должен ли он быть изменяемым? Используйте список. Разве это не должно быть изменчивым? Используйте кортеж.

В противном случае это вопрос выбора.

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

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

43
ответ дан 22 November 2019 в 23:24
поделиться

The first thing you need to decide is whether the data structure needs to be mutable or not. As has been mentioned, lists are mutable, tuples are not. This also means that tuples can be used for dictionary keys, wheres lists cannot.

In my experience, tuples are generally used where order and position is meaningful and consistant. For example, in creating a data structure for a choose your own adventure game, I chose to use tuples instead of lists because the position in the tuple was meaningful. Here is one example from that data structure:

pages = {'foyer': {'text' : "some text", 
          'choices' : [('open the door', 'rainbow'),
                     ('go left into the kitchen', 'bottomless pit'),
                     ('stay put','foyer2')]},}

The first position in the tuple is the choice displayed to the user when they play the game and the second position is the key of the page that choice goes to and this is consistent for all pages.

Tuples are also more memory efficient than lists, though I'm not sure when that benefit becomes apparent.

Also check out the chapters on lists and tuples in Think Python.

14
ответ дан 22 November 2019 в 23:24
поделиться

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

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

82
ответ дан 22 November 2019 в 23:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: