Кортежи (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
). В этом состоит важное отличие от словарей с ключами-строками. Кроме того, невозможно длбавлять или удалять поля налету.