#
4.1 名前づけと束縛 (naming and binding)

名前 (name)とは、オブジェクトを参照する ものを指します。名前への束縛 (name binding) 操作を行うと、 名前を導入できます。プログラムテキスト中に名前が出現するたびに、 その名前が使われている最も内側の関数ブロック中で作成された 束縛 (binding) を使って名前の 参照が行われます。

ブロック (block)は、Python のプログラムテキスト からなる断片で、一つの実行単位となるものです。 モジュール、関数本体、そしてクラス定義はブロックです。 また、対話的に入力された個々のコマンドもブロックです。 スクリプトファイル (インタプリタに標準入力として与えたり、 コマンドラインの第一引数として指定したファイル) は、コードブロック です。スクリプトコマンド (インタプリタのコマンドライン上で `-c' オプションを使って指定したコマンド) もコードブロック です。組み込み関数 `eval()` や `exec` 文に 渡した文字列もコードブロックになります。 組み込み関数 `input()` から読み取られ、評価される 式もまた、コードブロックです。

コードブロックは、実行フレーム (execution frame) 上で実行されます。実行フレームには、 (デバッグに使われる) 管理情報が収められています。また、 現在のコードブロックの実行が完了した際に、どのようにプログラムの 実行を継続するかを決定しています。

スコープ (scope)は、ある名前があるブロック内で 参照できるかどうかを決めます。ローカル変数があるブロック内で定義されて いる場合、変数のスコープはそのブロックを含みます。関数ブロック内で 名前の定義を行った場合、その名前に対して別の束縛を行っている ブロックを除いた、関数内の全てのブロックを含むようにスコープが 拡張されます。 クラス内で定義された名前のスコープは、クラスのブロック内に制限 されます; スコープがメソッドのコードブロックを含むよう拡張される ことはありません。

ある名前がコードブロック内で使われると、その名前を最も近傍から囲う ようなスコープ (最内スコープ: nearest enclosing scope) を使って束縛の 解決を行います。こうしたスコープからなる、あるコードブロック内で 参照できるスコープ全ての集合は、ブロックの 環境 (environment)と呼ばれます。

ある名前がブロック内で束縛されている場合、名前はそのブロックに おけるローカル変数 (local variable) です。 ある名前がモジュールレベルで束縛されている場合、名前は グローバル変数 (global variable) です。 (モジュールコードブロックの変数は、ローカル変数でもあるし、 グローバル変数でもあります。) ある変数がコードブロック内で使われているが、そのブロックでは定義 されていない場合、変数は 自由変数 (free variable)です。

ある名前の定義がどこにもない場合、 `NameError` 例外が送出されます。名前がまだ束縛されていないローカルな変数を参照 した場合、`UnboundLocalError` 例外が送出されます。`UnboundLocalError` は、 `NameError` のサブクラスです。

名前への束縛は、以下の文構成 (construct): 関数の仮引数 (formal parameter) 指定、`import` 文、クラスや関数の定義 (定義を行ったブロック中 で、クラスや関数名の束縛が行われます)、代入時に、代入対象が識別子 である場合、`for` ループのヘッダ、または第二形式の `except` 文ヘッダ、で行われます。 ``"`from...import *`"'' 形式の import 文は、 import しようとするモジュール内で定義されている名前について、 アンダースコアから始まっている名前以外の全てを束縛します。 この形式は、モジュールレベルでしか使うことができません。

`del` 文で指定された対象は、(`del` の意味付けは、 実際は名前の解放 (unbind) ですが) 文の目的上、束縛済みのもの とみなされます。外側のスコープで参照されている名前の解放は、 不正な操作になります; コンパイラは `SyntaxError` を 報告するでしょう。

代入文や import 文はいずれも、クラスや関数定義、モジュールレベル (トップレベルのコードブロック) 内で起こります。

ある名前束縛操作がコードブロック内のどこかにある場合、ブロック 内でその名前を使うと、全て現在のブロックで束縛されている名前を 指すものとみなされます。このため、ある名前が束縛される前に ブロック内で使われるとエラーを引き起こす可能性があります。

この規則はやや微妙です。Python には宣言文がなく、コードブロックの どこで名前束縛操作を行ってもかまいません。 あるコードブロックにおけるローカル変数は、 ブロック全体から名前束縛操作が行われている部分を走査して決定 します。

global 文で指定された名前がブロック内にある場合、その名前は 常にトップレベルの名前空間で束縛された名前を参照します。 それらの名前はグローバル名前空間、すなわちコードブロックが収め られているモジュールの名前空間とモジュール名 `__builtin__` で表される組み込み名前空間、を検索することによって、トップレベルの 名前空間で解決されます。グローバル名前空間は、常に最初に検索 されます。名前がグローバル名前空間中に見つからない場合、組み込み 名前空間が検索されます。global 文は、その名前が使われている全て の文に先立って記述されていなければなりません。

あるコードブロックの実行時に関連付けられる組み込み名前空間は、 実際にはコードブロックのグローバル名前空間内に入っている名前 `__builtins__` を参照する形になっています; `__builtins__` は辞書かモジュール (後者の場合にはモジュールの辞書が使われます) でなければなりません。通常、`__builtins__` 名前空間は、 組み込みモジュール `__builtin__` (注意: `s' なし) のモジュール辞書です。そうでない場合、制限実行 (restricted execution) モードが有効になっています。

あるモジュールの名前空間は、そのモジュールが最初に import された 時に自動的に作成されます。スクリプトの主モジュール (main module)は 常に `__main__`と呼ばれます。

グローバル文は、同じブロックの束縛操作と同じスコープを持ちます。 ある自由変数の最内スコープに global 文がある場合、その自由変数は グローバル変数とみなされます。

クラス定義は一つの実行文で、名前の使用や定義を行います。クラス定義 への参照は、通常の名前解決規則に従います。 クラス定義の名前空間は、そのクラスの属性辞書になります。 クラスのスコープで定義された名前は、メソッドからは見えません。