私がPython チャットルームでぶらぶらしていたときに、誰かが立ち寄って次の例外を報告しました。
NameError: free variable 'var' referenced before assignment in enclosing scope
私は以前にそのエラーメッセージを見たことがなく、ユーザーが提供したのは小さなコードフラグメントだけであり、それ自体がエラーを引き起こした可能性はありませんでした。 . 私が検索している間、ユーザーは問題が解決したことを「空白の問題」として報告し、部屋を出ました。
少し遊んだ後、次のようなおもちゃのコードでのみ例外を再現できました。
def multiplier(n):
def multiply(x):
return x * n
del n
return multiply
それは私に与えます:
>>> triple = multiplier(3)
>>> triple(5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in multiply
NameError: free variable 'n' referenced before assignment in enclosing scope
すべて順調ですが、上記の例が
- かなりばか
- 偶然に起こる可能性は低い
...しかし、この質問の冒頭で述べたレポートを考えると、明らかにそうです。
では、この特定の例外が実際のコードでどのように発生するのでしょうか?