Области видимости

Области видимости

Область видимости переменной – это участок кода программы, в котором данная переменная доступна для использования.

При объявлении нового имени, имя создается в своем скоупе, если эта переменная объявляется на уровне модуля она будет находиться в "глобальном" скоупе.

  • Глобальная область видимости - область видимости переменных на уровне модуля.
  • Локальная область видимости - область видимости на уровне функции.
  • Объемлющий модуль – это глобальная область видимости. Каждый модуль – это глобальная область видимости, то есть пространство имен, в котором создаются переменные на верхнем уровне в файле модуля. Глобальные переменные для внешнего мира становятся атрибутами объекта модуля, но внутри модуля могут использоваться как простые переменные.

  • Глобальная область видимости охватывает единственный файл. Не надо заблуждаться насчет слова «глобальный» – имена на верхнем уровне фай- ла являются глобальными только для программного кода в этом файле. На самом деле в языке Python не существует такого понятия, как всеобъемлющая глобальная для всех файлов область видимости. Имена всегда относятся к какому-нибудь модулю и всегда необходимо явно импортировать модуль, чтобы иметь возможность использовать имена, определяемые в нем. Когда вы слышите слово «глобальный», подразумевайте «модуль».

Каждый вызов функции создает новую локальную область видимости. Всякий раз, когда вызывается функция, создается новая локальная область видимости – то есть пространство имен, в котором находятся имена, опре- деляемые внутри функции. Каждую инструкцию def (и выражение lambda) можно представить себе, как определение новой локальной области видимости. Но так как язык Python позволяет функциям вызывать самих себя в цикле (этот прием известен как рекурсия), локальная область видимости с технической точки зрения соответствует вызову функции – другими словами, каждый вызов создает новое локальное пространство имен. Рекурсию удобно использовать, когда выполняется обработка данных, структура которых заранее не известна.

A = 1 # global
B = 2 # global
def main():
global A
a = 1 # local (for main)
b = 2 # enclosing (for b in inner)
A = 3 # global
def inner():
nonlocal b
a = 1 # local(for inner)
b = 3 # enclosing (from main)
  • На уровне модуля(глобальная)

    Имена объявленные вне функций и вне классов называются глобальными, значит что доступные из любой другой области видимости в рамках модуля.

    A = 1 # global
    def foo():
    global A
    A = 2
    foo()
    print(A) # 2
  • На уровне функции/класса (локальная)

    Имена объявленные внутри инструкции def или class

    a = 1 # global
    def foo():
    a = 3 # local for foo
    foo()
    print(a) # 1
  • На вышележащем локальном уровне (объемлющая)

    Имена объвленные в объемлющей локальной области видимости.

    def foo():
    a = 1
    def bar():
    nonlocal a
    a = 2 # from enclosing scope(foo)

Инструкции global/nonlocal

  • global

    Для того чтобы указать, что внутри области видимости функции должна испльзоваться глобальная переменная используется инструкция global

    Syntax:

    def <fn_name>():
    global <names> # перечисляем те имена, которые надо искать
  • nonlocal

    Для того чтобы указать, что внутри вложенной функции должны испльзоваться переменные из объемлющей области видимости - испльзуется инструкция nonlocal.

    Syntax:

    def <fn_name>():
    nonlocal <names> # перечисляем те имена, которые будут искаться в объемлющей области