名前が定義されていない場合とバインドされていない場合は、実行時に と がそれぞれ表示され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_locals1.1
currentframe.f_localsグローバル名前空間に対応し、適切な名前が見つからない場合はスローするNameError1.1 適切な名前が見つかり、境界がある場合は返す
currentframe.f_locals[name]1.2 適切な名前が見つかり、無制限の場合は
UnboundLocalNameエラーをスローします。で検索しようとして
nameいますcurrentframe.f_back.f_locals
私の理解を確認してください。