名前が定義されていない場合とバインドされていない場合は、実行時に と がそれぞれ表示されNameError
ます。UnboundLocalError
しかし、実行時に名前の評価がどのように行われるのかは明確ではありません。私は次のことを想定しています:
コードスニペットの例を検討してください
def foo():
a=3
def bar():
return a
tmp=bar()
res=a+tmp
return res
bar
関数が呼び出されると、新しい実行フレームが作成されます。このフレームを としbar_frame
ます。bar_frame.f_local
ディクショナリに含まれる要素はありません。ただしbar_frame.f_back.f_locals
、4 つの名前と値のペアが含まれています。など
私の理解:名前評価には次のアルゴリズムがあります。
で検索しようとして
name
いますcurrentframe.f_locals
1.1
currentframe.f_locals
グローバル名前空間に対応し、適切な名前が見つからない場合はスローするNameError
1.1 適切な名前が見つかり、境界がある場合は返す
currentframe.f_locals[name]
1.2 適切な名前が見つかり、無制限の場合は
UnboundLocalName
エラーをスローします。で検索しようとして
name
いますcurrentframe.f_back.f_locals
私の理解を確認してください。