自由変数と束縛変数
pythonのドキュメントをみていて、自由変数と束縛変数という言葉が出てきた。 なんだろうと思って調べてみた。
【 目次 】
ウィキペディアをみても意味がよくわからい。
- 自由変数と束縛変数 - Wikipedia
プログラミングにおいては、自由変数とは関数の中で参照されるローカル変数や引数以外の変数を意味する。
他のサイトも参考にしてみる。
どうにも言葉が抽象的で意味がわからない。
単純に言ってしまえば、関数の引数とローカル変数は束縛変数で、それ以外の例えばグローバル変数などは自由変数って事?
クロージャが関係しているらしい。
関数の外側で宣言している変数が関数内部で使われている場合、その関数の動作に影響を与える変数であるが、関数の外部から自由に操れる変数という意味で自由変数というのかしら。
一方、関数の引数とローカル変数は、関数そのものにパラメータ(引数値)を与える事で関数の動作が固定(束縛)されてしまうので、束縛変数というのかしら?
自分の書いた文章もやっぱり抽象的。('ω'*)アハ♪
実用的なコードでは無いが、例えば
pythonのコード
def func_factory(b): c = "c" def func(x): d = "d" return x + a + b + c + d return func a = "a" f = func_factory("b") print f("x") a = "A" f = func_factory("B") print f("X")
関数funcにとって、関数funcの外側で宣言されている変数a
,b
,c
は自由変数、引数x
や(関数funcにとっての)ローカル変数のd
は束縛変数って事?
合ってるのかどうか、どうも自信が無い。
追記
自由変数と束縛変数を区別する意味はクロジャー関数の中のレキシカル変数の役割に関係しているようで、 クロージャは関数の外側の関数のローカル変数の値を内側の関数が保持して、外側の関数のローカル変数の値を利用する事で関数の動作を変更する事ができる。
グローバル変数はローカル変数とは別のメモリー領域で管理されていて、自由変数のなかに入らないのかも?