Как " NameError: свободная переменная 'var', на которую ссылаются перед назначением в заключительной области", может происходить в реальном коде?
пока я болтался в чат 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
все хорошо и хорошо, но мне трудно понять, как это исключение может произойти в дикой природе, учитывая, что мой пример выше
- глупо
- вряд ли произойдет случайно
... но очевидно, что при докладе я упоминается в начале этого вопроса.
Так как can это конкретное исключение происходит в реальном коде?
1 ответов
подумайте о более сложной функции, где n привязан в зависимости от некоторого условия, или нет.  Вы не должны del имя, о котором идет речь, также происходит, если компилятор видит назначение, поэтому имя локально, но путь кода не берется, и имя никогда ничего не назначается.  Еще один глупый пример:
def f():
    def g(x):
        return x * n
    if False:
        n = 10
    return g
