Каково различие между списками и кортежами в Python?

Который более эффективен? Каково типичное использование каждого?

7
задан banx 28 July 2010 в 22:13
поделиться

3 ответа

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

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

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

return fee, fie, foo, fum

т.е. возвращать кортеж с четырьмя элементами, а не

return [fee, fie, foo, fum]

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

Полезным вариантом кортежа является его подтип collections.namedtuple (требует Python 2.6 или выше), который позволяет обращаться к элементам как по имени (с синтаксисом атрибута), так и по индексу (обычным способом). Например, с import collections в верхней части модуля, вышеприведенный return оператор может стать...

freturn = collections.namedtuple('freturn', 'fee fie foo fum')

def f():
  ...
return freturn(fee, fie, foo, fum)

Теперь вызывающая сторона f() может использовать возвращаемое значение в качестве кортежа, как и раньше, но при этом получит приятные альтернативы, такие как...:

r = f()
print r.fie

вместо менее понятного и читабельного

print r[1]

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

они легковесны и требуют не больше памяти, чем обычные кортежи. больше памяти, чем обычные кортежи.

7
ответ дан 6 December 2019 в 11:45
поделиться

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

Прочтите это .

6
ответ дан 6 December 2019 в 11:45
поделиться

Списки изменяемы (могут быть изменены), кортежи неизменяемы. Типичное использование: звучит банально, но вы используете списки, когда вам нужно изменить значения. Кортежи, как правило, немного более эффективны из-за их неизменности (если вы не используете их как списки и не дублируете их часто ...)

3
ответ дан 6 December 2019 в 11:45
поделиться
Другие вопросы по тегам:

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