4.1.1 動的な機能とのやりとり

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

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

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

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

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

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



脚注

... 自由変数は最内名前空間ではなく、グローバル名前空間から解決されます。4.1
この制限は、上記の操作によって実行されるコードが、モジュールをコンパイルしたときには利用できないために起こります。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。