Pythonのタプル(tuple)の基本と使いどころについて解説します。
Contents
タプル(tuple)の特徴と基本的な使い方
Pythonのタプル(tuple)とは、リストと同様で任意の要素を集めて列挙したシーケンスです。
本記事では、タプルの特徴や作成方法など基本的な点について説明していきます。
タプル(tuple)の特徴
タプルは、リストに非常に似ていますがイミュータブル(immutable)であるという点が異なっています。
イミュータブル(immutable)とは、その言葉の通り変更不可(値を変えることができない)ということです。一方で、リストなどの値を変更可能であることをミュータブル(mutable)と言います。
イミュータブルという特徴のため、タプルは一度生成したら要素追加や値の変更等の変更操作ができません。一方で、リストであれば値を変更したり、appendなどで要素を追加したりできます。
タプル(tuple)の基本的な使い方
タプルの作成と要素へのアクセス
タプル(tuple)の基本的な使い方を見ていきましょう。タプルを作成するには以下のように()で要素を順番に列挙することで作成できます。
# タプルの作成方法 tpl = ('A', 'B', 'C') print(type(tpl)) print(f'tpl: {tpl}') print(tpl[0], tpl[1], tpl[2])
【実行結果】 <class 'tuple'> tpl: ('A', 'B', 'C') A B C
タプルの各要素にアクセスするにはリストと同様に[]で位置を指定することでアクセスすることができます。(位置は0から始まりますので注意しましょう)
括弧なしでタプルを作成する
タプルは、以下のように括弧「()」なしで、','(カンマ)で要素を列挙するだけでも作成できます。
# ()がなくてもタプルとして作成される tpl = 'A', 'B', 'C' print(type(tpl)) print(f'tpl: {tpl}')
【実行結果】 <class 'tuple'> tpl: ('A', 'B', 'C')
typeで型を確認していますが、タプルとして作成されていることが分かるかと思います。
上記のような記載をすることもできるのですが、タプルであることを明示するためにも()で作成するようにした方がよいでしょう。
このことは以降で説明するアンパックのことをしっかりと理解するための知識として役立ちます。()がなくても','(カンマ)で要素を列挙するだけでもタプルとなることは覚えておきましょう。
タプルのアンパック
アンパックの基本的な考え方
タプルの要素を複数の変数に代入したい場合には、以下のように簡単に代入ができます。このような代入の方法は、タプルのアンパック(またはアンパック代入)と言います。
# タプルのアンパック tpl = ('A', 'B', 'C') a, b, c = tpl print(f'a = {a}, b = {b}, c = {c}')
【実行結果】 a = A, b = B, c = C
複数変数を列挙した定義はタプルのアンパックとなっている
これまでの説明でタプルは括弧「()」がなくても、','(カンマ)で要素を列挙するだけで作成できることを説明しました。
Pythonを勉強し始めたころに、以下のように変数を列挙して値を代入できることを知るかと思います。
a, b, c = 'A', 'B', 'C' print(f'a = {a}, b = {b}, c = {c}')
【実行結果】 a = A, b = B, c = C
上記コードの実態としては、「=の右側でタプルが生成」されて、それが「アンパックされて各変数に代入」されているという動きとなっているわけです。
アンパックを利用した値の交換
タプルのアンパックの考え方を使うと、以下のように要素の交換を簡単に行うことができます。
data1 = "A" data2 = "B" print( f"data1: {data1}, id(data1): {id(data1)}, " f"data2: {data2}, id(data2): {id(data2)}" ) # 要素の交換 data1, data2 = data2, data1 print( f"data1: {data1}, id(data1): {id(data1)}, " f"data2: {data2}, id(data2): {id(data2)}" )
【実行結果】 data1: A, id(data1): 1234656225968, data2: B, id(data2): 1234655913072 data1: B, id(data1): 1234655913072, data2: A, id(data2): 1234656225968
※ 上記例のid値の部分は実行ごとに変わるため全く同じにはなりませんのでご注意ください。
上記のようにアンパックによってdata1とdata2の内容が簡単に交換できていることが分かります。idについて出力してみていますが、この値からもdata1とdata2が参照する先が交換されていることが分かります。
タプルの使いどころ
値が変更されたくないときに利用する
タプルがリストと違って特徴的なところは、イミュータブル(immutable)で変更不可であるという点です。
この特徴を考慮すると、例えばあらかじめ用意した選択肢からユーザーに選ばせるようなプログラムを作ったとしたときに、選択肢リストを定義するときにタプルを使うことができます。もし、選択肢をリストで作成してしまった場合、プログラミングのミスにより誤ってappendなどで要素を追加してしまい、選択肢がおかしなことになる可能性があります。
つまり、タプルを使うか、リストを使うかは、列挙された項目がプログラム上変更されたくないかどうかということを判断基準として使えます。もし、プログラム上変更されたくないような設定値、選択肢などを扱うときにはタプルを使用するとよいでしょう。
また、関数の戻り値として複数要素を返却する場合についても、一般的にタプルに設定して返却します。
- タプルがリストと違い特徴的な部分はイミュータブル(immutable)で変更できないこと。
- プログラム実行中に変更されたくないような設定値、選択肢などを扱うときはタプルを使用するとよい。
- 関数の返り値として複数要素を返却する場合にも、一般的にタプルが使用される。
【参考】名前付きタプル(namedtuple)
タプルは関数の戻り値などで使用できるということで紹介しましたが、関数の戻り値として使用する場合はcollectionsモジュールの名前付きタプル(namedtuple)を使うと、どの値が何を意味するかを明示することができて便利です。
名前付きタプル(namedtuple)については、「namedtupleで名前付きタプルを使用する(collections.namedtuple)」でまとめていますので興味があれば参考にしてください。
まとめ
Pythonのタプル(tuple)の基本と使いどころについて解説しました。
タプルが特徴的なのは、イミュータブル(immutable)で変更不可であるという点です。その特徴から、プログラム実行中に変更されたくないような設定値や選択肢等を扱うときに使用すると便利です。また、関数の戻り値として複数要素を返却する場合にも一般的にタプルが使用されます。
リストなどの変更可能なミュータブル(mutable)はものとは特徴が異なっていますので、うまく使い分けてプログラミングしていただけるとよいかと思います。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。