2.8. タプル

タプル はイミュータブルで順序付けされた値のシーケンスです。一度作成すると、内部の要素を追加、削除、変更することはできません。

2.8.1. タプルの作成

タプルを作成するには、かっこ(または単にカンマ)を使います:

empty   = ()
point   = (3, 4)
triple  = 1, 2, 3                # parentheses are optional
mixed   = (1, "two", 3.14)
nested  = ((1, 2), (3, 4))

2.8.1.1. 単一要素の落とし穴

値を囲むかっこは単なるかっこです。実際にタプルを作るのは カンマ です。1要素のタプルには末尾のカンマが必要です:

>>> (1)
1                                # just an int in parens
>>> (1,)
(1,)                             # a one-element tuple
>>> type((1)), type((1,))
(<class 'int'>, <class 'tuple'>)

2.8.2. 長さ、インデックス指定、スライス

リストや文字列と同じです。len()、インデックス指定、スライス、in+ / * はすべて同じように動作します:

>>> point = (3, 4, 5)
>>> len(point)
3
>>> point[0]
3
>>> point[1:]
(4, 5)
>>> 4 in point
True
>>> (1, 2) + (3, 4)
(1, 2, 3, 4)

2.8.3. イミュータビリティ

タプルには appendpopsort などのその場で変更するメソッドはありません。インデックス付き代入は TypeError を送出します:

>>> point = (3, 4)
>>> point[0] = 99
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object doesn't support item assignment

タプルを「変更」するには、変更後の値で新しいタプルを構築します。

2.8.4. アンパック

タプルの主な必殺技は アンパック です。1つの文で各要素を別々の変数に代入します。

3要素のタプル (1, 2, 3) を、名前付き変数 x, y, z の 3つにアンパックしている。

アンパックは、1つの代入でタプルの各要素を名前付き変数に束縛します。

>>> point = (3, 4)
>>> x, y = point
>>> x
3
>>> y
4

右辺には任意のイテラブルを使えます。リスト、文字列、関数の戻り値などです:

>>> a, b, c = "abc"
>>> a, b, c
('a', 'b', 'c')

先頭の * は、アンパックの「残り」をリストにまとめます:

>>> first, *rest = [10, 20, 30, 40]
>>> first
10
>>> rest
[20, 30, 40]

2.8.5. 複数の戻り値

関数はタプルを返すことで、一度に複数の値を渡せます。呼び出し側は受け取る際にそれらをアンパックします:

def size_of(rect):
    return (rect[2] - rect[0], rect[3] - rect[1])

width, height = size_of((10, 20, 110, 140))
# width = 100, height = 120

return のかっこは省略可能です。return a, b のように裸で書いてもタプルです。

2.8.6. タプルとリスト

どちらを選ぶべきかの実用的な指針:

  • タプル は、形が固定された、しばしば異種混在のデータに使います。(x, y) の点、(r, g, b) のカラー、複数の戻り値、後で使うためにまとめた関数引数などです。

  • リスト は、可変長で、しばしば同種のデータに使います。測定値のリスト、処理する要素のキュー、追加が予想されるものすべてです。

タプルは ハッシュ可能 でもあるため(内部のすべての要素がハッシュ可能である限り)、dict のキーとして使えます。