##
1 動的な機能とのやりとり

自由変数の入った入れ子スコープ (nested scope) を併用すると、 Python の文が不正な文になる場合がいくつかあります。

ある変数がスコープの外側から参照された場合、その名前に対する 削除操作は不正になります。この場合、コンパイル時にエラーが 報告されることになります。

ワイルドカード形式の import 文 -- "`import *`" -- を関数内で使った場合や、関数が自由変数を含んでいたり、自由変数 を伴う入れ子ブロックである場合、コンパイラは SyntaxError を 送出します。

`exec` が関数内で使われており、関数が自由変数を含んでいたり、 自由変数を伴う入れ子ブロックである場合、`exec` に明示的に ローカル名前空間を指定しないかぎりコンパイラは SyntaxError を 送出します。 (別の言い方をすれば、"`exec obj`"は不正になることがあり、"`exec obj in ns`" はならない、という ことです。)

`eval()`、 `execfile()`、および `input()` 関数、そして `exec` 文は、名前の解決を行う際に、現在の環境 に対して完全にアクセスできるわけではありません。名前が呼び出し側の ローカル名前空間やグローバル名前空間から解決されることはあります。 自由変数は最内名前空間ではなく、グローバル名前空間から解決されます。 3

`exec` 文と、関数 `eval()` および `execfile()` にはオプションの引数があり、グローバルおよび ローカル名前空間をオーバライドできます。名前空間を一つしか指定 しなければ、両方の名前空間として使われます。

#### Footnotes

... 自由変数は最内名前空間ではなく、グローバル名前空間から解決されます。3
  この制限は、上記の操作によって実行されるコードが、モジュールをコンパイルしたときには利用できないために起こります。