リストとよく似ているが、変更不可能という大きな特徴を持つ「タプル」の基本、その操作、リストとの違いなどについて説明する。
* 本稿は2019年6月14日に公開された記事を、Python 3.12.0で動作確認したものです(確認日:2023年10月16日)。
前回まで3回に分けてPythonのリストを取り上げてきた。今回はリストと似たデータ構造である「タプル」について見ていこう。
冒頭でも述べたが、タプルはリストとよく似ている。リストは角かっこ「[]」の中にカンマ区切りで要素を並べて表記したが、タプルでは角かっこの代わりにかっこ「()」を使う。その要素をカンマで区切って並べるのはリストと同様だ。
以下に例を示す。
sk = ('shinji', 'kawasaki', 80)
print(sk)
これを実行すると、次のような表示となる。
先ほどのコードの1行目では上で述べた通り、かっこ「()」中にカンマ区切りで要素を並べることでタプルを作成している。2行目ではそれを表示しているだけだが、タプルの表現も同様な形式になっていることが分かるはずだ(後述するが、タプル作成時にはかっこ「()」は省略可能)。
このように見た目はリストとよく似ているが、タプルには「その要素を変更できない」という特徴があり、これがリストとの大きな違いとなっている。
なお、「変更できない」ことを「イミュータブル」(immutable)と、「変更できる」ことを「ミュータブル」(mutable)と呼ぶことがある。リストは「ミュータブルなオブジェクト」であり、タプルは「イミュータブルなオブジェクト」だ。
先ほどの例では、かっこ「()」付きでタプルを作成したが、このかっこは省略できる。そのため、実際には次のようにしてもタプルを作成できる。
sk = 'shinji', 'kawasaki', 80
print(sk)
なお、空のタプルを作成する際にはかっこ「()」は省略できない。
emptytuple = () # 空のタプルの作成
print(type(emptytuple)) # emptytupleの型を調べてみる
要素が1つだけのタプルも作成できる。ただし、単純にかっこ「()」で囲むだけではダメだ。
oneitem_tuple = ('Python') # 1要素のタプル?
print(oneitem_tuple)
print(type(oneitem_tuple)) # oneitem_tupleの型を調べてみる
これを実行した結果が以下だ(空のタプルの作成例も同時に示しておく)。
要素が1つだけのタプルを作成したつもりだったが、その実行結果を見ると、最初の出力にはタプルを囲むかっこがない。また、2行目の出力は「<class 'str'>」となっている。その上の空のタプルの作成例では、タプルの型として「<class 'tuple'>」と表示されているのとは異なる結果だ。これは変数oneitem_tupleに文字列(str型)が代入されているということだ。つまり、これは文字列であって、タプルではない。
かっこ「()」は計算式における演算の優先順位の指定や関数呼び出しなどでも使われるため、「かっこで1つの要素を囲むだけでは、タプルの作成とは見なされない」ことが、こうなった理由だ。1要素で構成されるタプルを作成するには「カンマ(,)を要素の後に置く」のが常道だ(かっこはあってもなくても構わない)。
# どちらの方法でもよい
oneitem_tuple = ('Python',)
print(oneitem_tuple)
oneitem_tuple = 'Python',
print(oneitem_tuple)
実行結果を以下に示す。
こちらの方法では、print関数による出力結果を見ると、かっこで要素'Python'が囲まれると同時に、最後にカンマが含まれている。これが要素が1つしかないタプルだ。
リストの作成にlist関数が使えたように、tuple関数を使ってもタプルを作成できる。
tuple(iterabl)
引数に指定したiterableを基にタプルを作成する。
パラメーター | 説明 |
---|---|
iterable | タプルの作成に利用する反復可能オブジェクト(省略可能)。作成されるタプルの要素はiterableの要素と同じものになる。省略した場合は空のタプルが作成される |
tuple関数のパラメーター |
以下に例を示す(実行結果は省略)。
emptytuple = tuple() # 空のタプルを作成
mylist = [0, 1, 2, 3]
mytuple = tuple(mylist) # リストを基にタプルを作成
anothertuple = tuple(iter(mylist)) # イテレータを基にタプルを作成
print(mytuple)
print(anothertuple)
タプルの要素には、リスト同様、「[インデックス番号]」を付加してアクセスできる。
print(sk[0])
ただし、リストとは異なり、タプルは変更不可能であるため、タプルの要素への代入はできない。
sk[1] = 'okazaki'
例えば、上のコードを実行すると、次のようにエラーが発生する。
エラーメッセージの内容を見ると、「タプルオブジェクトでは、要素への代入はサポートされていない」となっている。
要素の変更が不可能なことを除けば(要素の削除ももちろん不可能)、タプルはリストと似た扱いができる。for文と組み合わせることも可能だ。以下に例を示す(予想通りの実行結果となるので、実行画面は割愛する)。
for item in sk:
print(item)
文字列やリストと同様にスライス操作によって、タプルの特定の範囲にある要素を取り出すことも可能だ。スライスの詳細については第6回「Pythonの文字列の操作」の「文字列から指定した範囲の要素(部分文字列)を取得する:スライス」や、第16回「リストの基本」の「リストの要素のスライス」を参照されたい。
Copyright© Digital Advantage Corp. All Rights Reserved.