Списки представляют собой изменяемые последовательности с множеством методов (как мутирующих, так и не мутирующих), которые чаще всего используются в качестве контейнеров общего назначения (их элементы вообще могут быть объектами любых типов, хотя иногда это считается лучшимстиль для списков, чтобы иметь элементы одного и того же типа или типов, которые будут использоваться эквивалентно).
Кортежи являются неизменяемыми последовательностями, с очень небольшим количеством методов (все не мутирующие специальные), которые чаще всего используются привам нужна неизменность для использования контейнера в качестве элемента в наборе или ключа в диктовке (хотя элементы также должны быть неизменяемыми - например, строки, числа или другие вложенные кортежи, чтобы это работало).Их элементы могут быть объектами любых типов, и для кортежей совершенно нормально иметь элементы разных типов.
Есть несколько случаев, когда кортеж или список будут также полезныи в таких немногих случаях тот факт, что кортежи немного меньше и быстрее строятся, может быть использован, чтобы повлиять на решение в пользу кортежей.Например, когда функции необходимо вернуть несколько результатов, наиболее нормально использовать
return fee, fie, foo, fum
, то есть возвращать кортеж с четырьмя рассматриваемыми элементами, а не
return [fee, fie, foo, fum]
, т.е.вернуть список с четырьмя элементами - кроме (небольшого увеличения) производительности, общая идиома «возврат кортежа» также решает проблему, заключающуюся в том, что часто возвращаемые множественные результаты не того же самого, нивзаимозаменяемые типы, так что, стилистически говоря, использование списка в любом случае может считаться более сомнительным выбором.
Полезный вариант tuple
- это его подтип collection.namedtuple (требуется Python2.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
, по существу не имеет дополнительных издержек по сравнению с непосредственным использованием кортежа, или, как сказано в документации,
они легки и требуют не больше памяти, чем обычные кортежи.1034 *