#acl SomeUser:read,write All: read = Pythonで可変変数 = . ある変数の値を変数名として使用できる変数のことを、perlでは可変変数と読んでいるようです。 {{{ % perl -e '$var1="var2"; $var2="Value of var2"; print "$$var1\n"' Value of var2 % }}} 記号を使うと簡潔に表現でき、嫌われがちな記号にも良い面があることが分かります。 . Python でこれを実現するにはどうすれば良いでしょうか? 具体的な例として、「年齢」という引数を受け取って、「年齢別件数」という名前の辞書を生成して返す場合を考えてみます。マニュアルを調べたり、インターネットを検索しても難解な解説ばかりで、インスタントな実現方法を見つけることが出来ませんでした。そこで代用となるやり方を考えて見ました。 . まず、変数の値を変数名として評価し、値を展開するには、evalを使うのが簡単だと思います。 {{{#!python var1 = 'var2' var2 = 'Value of var2' eval(var1) 'Value of var2' }}} . ただ、これだと代入文の左辺では使えません。多少乱暴ですが、 {{{#!python arg = 'nenrei' exec('dict_' + arg + ' = {}') print dict_nenrei {} }}} とすれば、目的とする名前の辞書が作られたことが分かります。 . でも良く考えてみると結果的に実現したことは、「ある名前に対応するオブジェクト(この場合は対応した辞書)を返す」ことです。途中での操作が必要無ければ、これは辞書そのものです。 {{{#!python counter = {} arg = 'nenrei' counter[arg] = {} print counter['nenrei'] {} }}} . 確かに一番最初の書き方は簡潔で洗練されているように感じます。しかし、簡潔な分、$が一つ無くなっただけで全然意味が違ってきてバグの元ですし、「説明性」を考えずに安易に使ってしまいがちです。 . 私達は、ある言語で使える機能が他の言語に無いと、その言語は劣っていると感じてしまいがちですが、大切なのは、「可変変数という機能がある」ことではなく、「実現したいことが出来る」ことです。 . 私は今回の例を通じて、言語のデザインとして、「何を含まないか」も、とても大切な要素だと感じました。次世代Python (Python 3000)の計画では、組み込み関数から除外される関数もあるそうです。Pythonは使っていて、あっと驚くことが無く、感覚として「理にかなっている」と感じることが多いのは、こんな風に慎重にデザインされていることに理由があるのかも知れません。 ---- CategoryPython