Когда в Python следует использовать списки, а когда кортежи?
Иногда у вас нет выбора, например, если у вас есть
"hello %s you are %s years old" % x
то x должен быть кортежем.
Но если я тот, кто разрабатывает API и имеет право выбирать типы данных, то каковы рекомендации?
Кортежи Tuples имеют фиксированный размер, в то время как списки List являются динамическими.
Другими словами, кортеж
является неизменяемым, а список
- изменяемым.
in
.Если вы определяете постоянный набор значений и все, что вы собираетесь делать с ним, это перебирать его, используйте кортеж вместо списка.
Это делает ваш код более безопасным, если вы "защищаете от записи" данные, которые не должны быть изменены. Использование кортежа вместо списка подобно подразумеваемому утверждению, что эти данные являются постоянными, и что для их отмены требуется специальная мысль (и специальная функция).
Некоторые кортежи можно использовать в качестве ключей словарей (в частности, кортежи, содержащие неизменяемые значения, такие как строки, числа и другие кортежи). Списки никогда не могут быть использованы в качестве ключей словарей, поскольку списки не являются неизменяемыми.
Источник: Dive into Python 3
Там'с сильной культурой кортежей для гетерогенных коллекций, похожее на то, что вы'd с помощью `структуры в C, и списки для гомогенных коллекций, похожее на то, что вы'd с помощью массивов. Но я'ве никогда не квадрату этого вопроса изменяемость упоминалось в других ответов. Изменяемость имеет зубы, чтобы он (вы можете't изменить Кортеж), в то время как гомогенность не является обязательным, и поэтому кажется гораздо менее интересные различия.
Я считаю (и вряд ли я хорошо знаю Python), что основное различие заключается в том, что кортеж является неизменяемым (его нельзя изменить на месте после присваивания), а список является изменяемым (его можно добавлять, изменять, вычитать и т.д.).
Поэтому я склонен делать кортежи такими, которые не должны изменяться после присваивания, а списки - такими, которые могут.
Должен ли он быть изменяемым? Используйте список. Он не должен быть изменяемым? Используйте кортеж.
В остальном это вопрос выбора.
Для коллекций разнородных объектов (например, адрес, разбитый на имя, улицу, город, штат и почтовый индекс) я предпочитаю использовать кортеж. Их всегда можно легко преобразовать в named tuples.
Аналогично, если коллекция будет итерироваться, я предпочитаю использовать список. Если же это просто контейнер для хранения нескольких объектов как одного, я предпочитаю кортеж.
Первым делом вам нужно решить, является ли структура данных должна быть изменяемым или нет. Как уже было упомянуто, списки изменяемы, кортежей нет. Это также означает, что кортежи могут быть использованы для ключи, словарь, списки где нельзя.
По моему опыту, кортежи, как правило, используется там, где порядок и позиция осмысленным и последовательным. Например, в создании структуры данных для выбрать свой собственный приключенческая игра, я решил использовать кортежи вместо списков, поскольку позиции в кортеже был значимым. Вот один пример из этой структуры данных:
pages = {'foyer': {'text' : "some text",
'choices' : [('open the door', 'rainbow'),
('go left into the kitchen', 'bottomless pit'),
('stay put','foyer2')]},}
Первое место в кортеже-это выбор отображается для пользователя, когда они играют в игру и вторая позиция-это ключевые страницы, что выбор идет и это согласуется для всех страниц.
Кортежи также больше памяти, эффективной, чем списки, хотя я'м не уверен, когда, что выгода становится очевидной.
Также проверьте главы на списки и кортежи в думаю на Python.
но если я тот, кто проектирует API и получает, чтобы выбрать типы данных, то каковы правила?
Для входных параметров он'ы лучше принимать самый универсальный интерфейс, который делает то, что вам нужно. Это редко просто кортеж или список - чаще всего это's в последовательности, разрезаны или даже повторяемое. В Python'с утиной типизацией, как правило, получает его бесплатно, если вы явно не проверяем типы входного сигнала. Дон'т сделать это только в случае абсолютной необходимости.
Для данных, которые вы производите (выходные параметры) просто вернуть то, что's самый удобный для вас, например, вернуть любой тип данных можно сохранить или как ваш помощник возвращает функция.
Одна вещь, чтобы иметь в виду, чтобы избежать возвращения списка (или любой другой изменяемый), что's частью вашего государства, например
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, но его синтаксис безобразна в сравнении с его синтаксисом списка, что довольно приятно.
В тех случаях, вы можете использовать кортеж внутри и преобразовать в список как часть процесса экспорта. Поочередно, вы можете использовать списки везде по консистенции.