`del` оператор и свободные переменные

Тестируя некоторый код Python сегодня, я попробовал следующий код:

(Следующее работает на Python 3.2+, хотя предыдущие версии будут поднимать SyntaxError когда del используется и ссылка на переменную во вложенной области видимости)

def x():
    N = 200
    def y():
            print(N)
    del N
    y()
x() 
NameError: free variable 'N' referenced before assignment in enclosing scope 

Как видите, Python не поднимает NameError: global name 'N' is not definedи это заставило меня задуматься об одной вещи:

когда del оператор, используемый в рамках включенной области видимости функции для удаления свободной переменной, которая используется внутри вложенной функции, например y функция здесь и после этого, если эта свободная переменная в нашем случае N был удален через del заявление в прилагаемой области, что del на самом деле это удалить имя (N) значение и держит его привязанным к ограничивающей области?

А) Вот почему это поднимает: NameError: free variable 'N' referenced before assignment... скорее, чем NameError: global name 'N' is not defined?

Б) как del на самом деле удалить имя? Разъединяет ли оно свою ценность и сохраняет ли это в области видимости?

Я нашел похожий случай здесь

1 ответ

Решение

Работает так: когда пишешь print(N) внутри y но не присваивать N в yэто означает, что в то время y определен, Python просматривает вмещающие его области, чтобы найти ближайший, где имя N назначен. Неважно, является ли назначение N происходит до или после определения yили это позже отменено с del; он просто ищет ближайшую охватывающую область, где присваивание N существует. В этом случае, так как N назначен внутри x, y по существу делает небольшую заметку, говоря "когда мне нужно получить NБуду смотреть в сферу x".

Итак, когда вы на самом деле звоните yищет N в объеме x, Если его там нет, вы получите ошибку. Обратите внимание, что вы получаете эту же ошибку без del если вы переместите N = 100 после звонка y,

Другие вопросы по тегам