python: список против кортежа, когда использовать каждый? [дубликат]
этот вопрос уже есть ответ здесь:
В чем разница между списками и кортежами?
18 ответов
в Python, когда вы должны использовать списки и когда кортежи?
иногда у вас нет выбора, например, если у вас есть
"hello %s you are %s years old" % x
тогда x должен быть кортежем.
но если я кто проектирует API и получает возможность выбирать типы данных, тогда каковы рекомендации?
7 ответов:
существует сильная культура кортежей для гетерогенных коллекций, аналогичная тому, что вы используете
structs для C, а списки - для однородных коллекций, похожих на то, для чего вы используете массивы. Но я никогда не совсем уравнивал это с проблемой изменчивости, упомянутой в других ответах. Изменчивость имеет зубы к нему (вы на самом деле не можете изменить Кортеж), в то время как однородность не навязывается, и поэтому кажется гораздо менее интересным различием.
ОК фиксированный размер в природе тогда как списки динамичны.
Другими словами, atupleи неизменяемые, тогда какlistи mutable.
- вы не можете добавить элементы в кортеж. Кортежи не имеют метода добавления или расширения.
- вы не можете удалить элементы из кортежа. У кортежей нет метода remove или pop.
- вы можете найти элементы в кортеже, так как это не изменяет кортеж.
- вы также можете использовать
inоператор для проверки наличия элемента в кортеже.
кортежи работают быстрее, чем списки. если вы определяете постоянный набор значений и все, что вы когда-либо будете делать с ним, это перебирать его, используйте кортеж вместо списка.
это делает ваш код более безопасным, если вы" защищаете от записи " данные, которые не нужно изменять. Использование кортежа вместо a список похож на подразумеваемое утверждение assert, что эти данные постоянны, и что для переопределения этого требуется специальная мысль (и определенная функция).
некоторые кортежи могут использоваться в качестве ключей словаря (в частности, кортежи, содержащие неизменяемые значения как строки, числа, кортежи и другие). Списки никогда не могут быть использованы в качестве ключей словаря, потому что списки не являются неизменяемыми.
источник: погружение в Python 3
Я считаю (и я вряд ли хорошо разбираюсь в Python), что основное различие заключается в том, что кортеж неизменяемые (он не может быть изменен на месте после назначения) и список mutable (вы можете добавлять, изменять, вычитание и т. д.).
Итак, я склонен делать мои кортежи вещи, которые не должны меняться после назначения и мои списки вещей, которые могут.
должен ли он быть изменчивым? Используйте список. Разве она не должна быть изменчивой? Используйте кортеж.
в противном случае, это вопрос выбора.
для коллекций разнородных объектов (например, адрес разбит на имя, улицу, город, штат и zip) я предпочитаю использовать кортеж. Они всегда могут быть легко повышены до именованных кортежей.
аналогично, если коллекция будет повторяться, я предпочитаю список. Если это просто контейнер для хранения нескольких объектов во-первых, я предпочитаю кортеж.
первое, что вам нужно решить, является ли структура данных должна быть изменяемой или нет. Как уже упоминалось, списки изменчивы, кортежи-нет. Это также означает, что кортежи могут использоваться для ключей словаря, где списки не могут.
по моему опыту, кортежи обычно используются там, где порядок и позиция значимы и последовательны. Например, при создании структуры данных для выбора собственной приключенческой игры я решил использовать кортежи вместо списков, потому что позиция в кортеже было многозначительно. Вот один пример из этой структуры данных:
pages = {'foyer': {'text' : "some text", 'choices' : [('open the door', 'rainbow'), ('go left into the kitchen', 'bottomless pit'), ('stay put','foyer2')]},}первая позиция в кортеже-это выбор, отображаемый пользователю, когда он играет в игру, а вторая позиция-это ключ страницы, на которую идет выбор, и это согласовано для всех страниц.
кортежи также более эффективны для памяти, чем списки, хотя я не уверен, когда это преимущество станет очевидным.
также проверьте главы в списках и кортежах Подумайте Python.
но если я тот, кто разрабатывает 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
незначительное, но заметное преимущество списка над кортежем заключается в том, что списки, как правило, немного более портативны. Стандартные инструменты с меньшей вероятностью поддерживают кортежи. Например, JSON не имеет типа кортежа. YAML делает, но его синтаксис уродлив по сравнению с синтаксисом списка, что довольно приятно.
в этих случаях вы можете использовать кортеж внутренне, а затем преобразовать в список как часть процесса экспорта. Кроме того, вы можете использовать списки везде консистенция.
Comments