Кортежи (tuples) очень похожи на списки, но являются неизменяемыми. Как мы видели, использование изменяемых объектов может приводить к неприятным сюрпризам.
Кортежи пишутся в круглых скобках. Если элементов $>1$ или 0, это не вызывает проблем. Но как записать кортеж с одним элементом? Конструкция (x) абсолютно легальна в любом месте любого выражения, и означает просто x. Чтобы избежать неоднозначности, кортеж с одним элементом x записывается в виде (x,).
(1,2,3)
()
(1,)
Скобки ставить не обязательно, если кортеж - единственная вещь в правой части присваивания.
t=1,2,3
t
Работать с кортежами можно так же, как со списками. Нельзя только изменять их.
len(t)
t[1]
u=4,5
t+u
2*u
В левой части присваивания можно написать несколько переменных через запятую, а в правой кортеж. Это одновременное присваивание значений нескольким переменным.
x,y=1,2
x
y
Сначала вычисляется кортеж в правой части, исходя из старых значений переменных (до этого присваивания). Потом одновременно всем переменным присваиваются новые значения из этого кортежа. Поэтому так можно обменять значения двух переменных.
x,y=y,x
x
y
Это проще, чем в других языках, где приходится использовать третью переменную.
В стандартной библиотеке есть полезный тип namedtuple:
from collections import namedtuple
point=namedtuple('point',('x','y','z'))
p=point(0,1,2)
print(p)
К его полям можно обращаться как по имени, так и по номеру (как для обычного кортежа).
p.y,p[1]
При создании объекта типа namedtuple аргументы можно задавать в любом порядке, если указывать их имена.
p=point(y=1,z=2,x=0)
p
В этих объектах нет накладных расходов по памяти: только значения полей (как в structure в C или record в Pascal). Соответствие между именами полей и их номерами хранится в памяти один раз для всего типа (в нашем примере point). В этом состоит важное отличие от словарей с ключами-строками. Кроме того, невозможно длбавлять или удалять поля налету.