Pythonにおけるタプルの存在意義
入室だけして忙しくて読んでなかったチャットのログを読んでみた。 「要素を追加できないのがタプル」というような発言に対して 「固定長なだけじゃなくて、要素の変更もできない」という趣旨の言葉をかなり言葉足らずに投げっぱなしだったのでアフターサービスw
どうもその後は「変更できない配列なんて何に使うんだ」「コサイン値のテーブルを作ったりするのに使うんじゃないか」という話になっていた模様。 うーん、あんまりPythonみたいな高級言語でコサイン値をテーブルで保持するような低級なことをする人は居ないねぇ。
変更可能(mutable)な「リスト」に対して、「文字列」と「タプル」は変更不可能(immutable)なんだが、なんで変更できないなんていうデメリットのようなものを残してあるのだろうか。これは「変更できない」を「変更されていないことを保証できる」と言い換えればメリットにもなる。 この「変更されていないことを保証できる」という特長をによって、immutableなオブジェクトはある値(ハッシュ値)と一意に対応付けることができる。つまり、ハッシュ(辞書)のキーとして用いることができる。これがタプルというものの存在する最大のメリットだと思う。
data={} # dataは空の辞書
position=(x, y) # positionは2つの値のタプル(この場合はたぶん2次元のベクトル)
data[position]=z # タプルをキーにして辞書に値を入れることができる
Pythonの辞書(いわゆるハッシュ)は非常に強力な組み込みデータ型で、 immutableなオブジェクトならどんなものでもキーとして用いることができるんだ。 data[1]もOK、data[3.14]もOK、data[(1.0, 3.5)]もOK、さらに言えば maxTemperature[('大阪市', (2005, 1, 16))]なんて感じにいろんなオブジェクトをくっつけて一つにしたモノだってキーにできる。 そして当たり前だけど値のほうにはmutable/immutable関係なくどんなオブジェクトでもつっこむことができる。
for pos in data.keys(): # data.keys()はdataと書いても実はかまわない (x, y)=pos # tuple unpacking print x, data[pos] # xとzの関係を表示
タプルやハッシュの強力さのおかげでPythonでプロトタイプを作るのはかなり楽チンなんだけど、問題点もある。それは「要素が1個のタプル」を直感的に(x)と書きたいんだけど、それじゃ演算の優先順序を変える(x+y)*zの括弧と区別できない、って点。それが原因で要素が一つのタプルは(x,)なんていう気持ちの悪い書き方をしないといけなかったりする。