NISHIO Hirokazu's website > NISHIO HIROKAZU # Archived COREBlog
これは2004年11月4日から2006年2月18日までZopeで運用していたCOREBlogの静的なアーカイブです。 新しい日記は「西尾泰和の日記」で運用しています。

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,)なんていう気持ちの悪い書き方をしないといけなかったりする。


[Python]  @2005-01-18 06:43
<< バグ発見 | Main | マッチ棒パズルの解の分布 >>

Comments このページは静的なアーカイブなので新しいコメントは受け付けておりません。ご意見ご感想はお気軽にメールでどうぞ。coreblog「あっとまーく」nishiohirokazu.org。
Trackbacks

PageView: 1790 Score: 127.08223 このカウンタは2006-03-26 11:05で停止しています。
Powered by COREBlog

NISHIO Hirokazu's website > NISHIO HIROKAZU # Archived COREBlog
Contact me: coreblog"at mark"nishiohirokazu.org
Access counter: This Page:712526 Total:1827237 during 2004/01/23-2006/03/26