# タプルの要素をカンマ「,」で並べる
t0 = 0, 1, 2
print(type(t0)) # <class 'tuple'>
print(t0) # (0, 1, 2)
# カンマで区切った要素をかっこ「()」で囲む
t0 = (0, 1, 2) # タプルであることが明示的になる
t0 = () # 要素が0個のタプル
print(t0) # ()
print(len(t0)) # 0
t0 = (1) # タプルではない
print(type(t0)) # <class 'int'>
t0 = (1,) # 1要素のタプルは要素とカンマを記述する
print(t0) # (1, )
# tuple関数を使う
t0 = tuple() # 要素が0個のタプル
print(t0)
t1 = tuple([0, 1, 2]) # tuple関数に反復可能オブジェクトを渡す
print(t1) # (0, 1, 2)
# 注意点
t0 = (0, 1, 2)
t0[0] = -1 # TypeError
l = [0, 1, 2] # リストはその要素を変更可能
t = (l,) # 変更可能なオブジェクトをタプルの要素とする
t[0][0] = -1 # OK
print(t) # ([-1, 1, 2],)
タプルとは
Pythonにおけるタプルは以下のような特徴を持ったオブジェクトだ。
- その要素を変更できない
- 要素の反復(イテレート)が可能
- インデックスを使って要素にアクセスできる
- 要素をアンパックして、複数の変数に要素を個別に代入できる
本稿ではタプルの作成(初期化)方法を紹介する。
タプルを作成する
タプルを作成するには以下の方法がある。
- タプルの要素となる値をカンマ「,」で区切って並べる
- tuple関数を呼び出す
1つ目の方法ではタプルを作成することを明確にするかっこ「()」の有無や要素が1つだけのタプルの作成などで注意する点もある。
以下はシンプルにカンマで区切ってタプルを作成する例だ。
t0 = 0, 1, 2
print(type(t0)) # <class 'tuple'>
print(t0) # (0, 1, 2)
1行目では3つの数値「0」「1」「2」をカンマで区切って並べている。これによりタプルが作成され、変数t0に代入されている。type関数にこれを渡してその型を調べると「<class 'tuple'>」となっている。また、print関数にこのタプルオブジェクトを渡すと、タプルの要素がかっこ「()」で囲まれて表示される。このかっこはタプルがタプルであることを明確にするものだ。
上で見たように、タプルを作成するときにはカンマで区切ってその要素を並べるだけでよいが、かっこを使ってそれがタプルであることを明確にできる。以下に例を示す。
t0 = (0, 1, 2) # タプルであることが明示的になる
要素が0個のタプル(空のタプル)を作成するには以下のようにかっこのみを記述する。
t0 = () # 要素が0個のタプル
print(t0) # ()
print(len(t0)) # 0
最初の行では「()」として空のタプルを作成している。print関数に渡すと「()」とだけ表示され、これが要素を持っていないことが分かる。タプルやリストなどの要素数を調べるlen関数に渡すと要素がないので戻り値は「0」となる。
要素を1個だけ持つタプルを作成するときには注意が必要だ。「(要素)」とするのではなく、以下のように最後にカンマを付加する必要がある。
t0 = (1) # タプルではない
print(type(t0)) # <class 'int'>
t0 = (1,) # 1要素のタプルは要素とカンマを記述する
print(t0) # (1, )
最初の行では「1」をかっこで囲んでいるが、これは式の評価順序を優先するためのかっことして処理され、結果は整数の1となる。3行目では「1」に続けてカンマを記述することでそれがタプルであるとPythonの処理系に伝えている。これによりタプルが作成される。
tuple関数を使ってもタプルを作成できる。この関数は引数を指定しなければ空のタプルを作成し、反復可能オブジェクトを渡せば、それを基にタプルを作成する。
以下に例を示す。
t0 = tuple() # 要素が0個のタプル
print(t0)
t1 = tuple([0, 1, 2]) # tuple関数に反復可能オブジェクトを渡す
print(t1) # (0, 1, 2)
1行目では引数なしでtuple関数を呼び出しているので空のタプルが作成されている。3行目では反復可能オブジェクトの一つであるリストをtuple関数に渡しているので、その要素からタプルが作成されている。
注意点
タプルはその要素を変更できない。例えば、以下のコードは(0, 1, 2)というタプルを作成して、その先頭要素の値を変更しようとしているが(t0[0] = -1)、これはTypeError例外を発生させる。
t0 = (0, 1, 2)
t0[0] = -1 # TypeError
しかし、リストのような変更可能なオブジェクトをタプルの要素とすることは可能だ。
l = [0, 1, 2] # リストはその要素を変更可能
t = (l,) # 変更可能なオブジェクトをタプルの要素とする
t[0][0] = -1 # OK
print(t) # ([-1, 1, 2],)
この例では「t[0][0] = -1」という操作をしているが、これは「t[0]」としてタプルの要素となっているリストを取り出して、その次の「[0]」でリストの先頭要素を対象に-1を代入している。これは可能な操作である。
また、タプルを作成するときにかっこを省略できるのは上で紹介した通りだが、省略できない場合もある。
例えば、関数の引数としてタプルをリテラル値として指定するときにはかっこを省略できない。以下に例を示す。
def func(x):
print(x)
func関数は引数を1つ受け取り、それを表示するだけのものだ。この関数に(0, 1, 2)というタプルを渡してみよう。
func(0, 1, 2) # TypeError
func関数が受け取る引数は1つだけなのに、上のような書き方では3つの引数を渡していると解釈され、TypeError例外が発生する。この場合、かっこを省略せずに次のように記述する必要がある。
func((0, 1, 2)) # OK
変数にタプルを代入しているのなら、その変数をfunc関数に渡すのはもちろん問題ない。
t = (0, 1, 2)
func(t) # OK
関数が可変長引数を受け取る場合にも、タプルを囲むかっこを省略すると想定とは異なる振る舞いをする。以下に例を示す。
print(0, 1, 2) # 0 1 2
(0, 1, 2)というタプルを渡しているつもりかもしれないが、これは3つの整数0、1、3をprint関数に渡しているだけだ。そのため、print関数の出力は3つの整数を半角空白文字で区切ったものになる。タプルを渡したければ、かっこを忘れずに記述する。
print((0, 1, 2)) # (0, 1, 2)
こうすれば、print関数は3つの要素を持つタプルオブジェクトを1個受け取り、その内容を表示してくれる。
この他にもタプルを囲むかっこを省略できない場面はある。タプルを渡したつもりが想定外の振る舞いをするときには、かっこを省略していないかを調べてみるのも解決手段の一つとなるだろう。
Copyright© Digital Advantage Corp. All Rights Reserved.