Области видимости
Области видимости
Область видимости переменной – это участок кода программы, в котором данная переменная доступна для использования.
При объявлении нового имени, имя создается в своем скоупе, если эта переменная объявляется на уровне модуля она будет находиться в "глобальном" скоупе.
- Глобальная область видимости - область видимости переменных на уровне модуля.
- Локальная область видимости - область видимости на уровне функции.
Объемлющий модуль – это глобальная область видимости. Каждый модуль – это глобальная область видимости, то есть пространство имен, в котором создаются переменные на верхнем уровне в файле модуля. Глобальные переменные для внешнего мира становятся атрибутами объекта модуля, но внутри модуля могут использоваться как простые переменные.
Глобальная область видимости охватывает единственный файл. Не надо заблуждаться насчет слова «глобальный» – имена на верхнем уровне фай- ла являются глобальными только для программного кода в этом файле. На самом деле в языке Python не существует такого понятия, как всеобъемлющая глобальная для всех файлов область видимости. Имена всегда относятся к какому-нибудь модулю и всегда необходимо явно импортировать модуль, чтобы иметь возможность использовать имена, определяемые в нем. Когда вы слышите слово «глобальный», подразумевайте «модуль».
Каждый вызов функции создает новую локальную область видимости. Всякий раз, когда вызывается функция, создается новая локальная область видимости – то есть пространство имен, в котором находятся имена, опре- деляемые внутри функции. Каждую инструкцию def (и выражение lambda) можно представить себе, как определение новой локальной области видимости. Но так как язык Python позволяет функциям вызывать самих себя в цикле (этот прием известен как рекурсия), локальная область видимости с технической точки зрения соответствует вызову функции – другими словами, каждый вызов создает новое локальное пространство имен. Рекурсию удобно использовать, когда выполняется обработка данных, структура которых заранее не известна.
На уровне модуля(глобальная)
Имена объявленные вне функций и вне классов называются глобальными, значит что доступные из любой другой области видимости в рамках модуля.
A = 1 # globaldef foo():global AA = 2foo()print(A) # 2На уровне функции/класса (локальная)
Имена объявленные внутри инструкции
def
илиclass
a = 1 # globaldef foo():a = 3 # local for foofoo()print(a) # 1На вышележащем локальном уровне (объемлющая)
Имена объвленные в объемлющей локальной области видимости.
def foo():a = 1def bar():nonlocal aa = 2 # from enclosing scope(foo)
global/nonlocal
Инструкции global
Для того чтобы указать, что внутри области видимости функции должна испльзоваться глобальная переменная используется инструкция
global
Syntax:
def <fn_name>():global <names> # перечисляем те имена, которые надо искатьnonlocal
Для того чтобы указать, что внутри вложенной функции должны испльзоваться переменные из объемлющей области видимости - испльзуется инструкция
nonlocal
.Syntax:
def <fn_name>():nonlocal <names> # перечисляем те имена, которые будут искаться в объемлющей области