`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
,