6

私が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

すべて順調ですが、上記の例が

  1. かなりばか
  2. 偶然に起こる可能性は低い

...しかし、この質問の冒頭で述べたレポートを考えると、明らかにそうです。

では、この特定の例外が実際のコードでどのように発生するのでしょうか?

4

1 に答える 1

5

nある条件に応じてバインドされる、またはバインドされない、より複雑な関数を考えてみてください。問題の名前にする必要はありませんdel。コンパイラが割り当てを認識した場合にも発生するため、名前はローカルですが、コード パスは取得されず、名前には何も割り当てられません。別のばかげた例:

def f():
    def g(x):
        return x * n
    if False:
        n = 10
    return g
于 2014-07-11T22:20:18.910 に答える