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

Материал из Институт биоинформатики
Перейти к: навигация, поиск

Области видимости (scopes) в языке Python - это текстовые участки программы, откуда напрямую доступны определенные пространства имен. Другими словами, это области, в которых определяется ограниченный набор переменных и в которых в первую очередь будет осуществляться их поиск при не специфическом запросе. Среди областей видимости можно выделить так внутреннюю (local scope), нелокальную (nonlocal/enclosing scope), глобальную (global scope) и внешнюю (Built-in scope) области.

Local scope

Теория

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

Пример

def func():
    a = 42 #Переменная а объявлена внутри данной функции
    print(a)
func(a) #Поиск по local scope увенчался успехом, на экране будет 42

Nonlocal scope

Теория

Это область, включающая в себя пространства имен тех функций, которые вызвали ту, с которой мы работаем в данный момент. Поиск переменных, не объявленных непосредственно в данной функции, будет идти "снизу вверх" - сначала в пространстве имен функции, вызвавшей рассматриваемую, затем в пространстве имен той функции, которая вызвала уже ее, и так далее

Полезный синтаксис

Как было сказано выше, переменные, объявленные внутри функции, при завершении выполнения этой функции пропадут. Тем самым, поменяв значение переменной а на 42 внутри функции func1(), по завершении этой функции обратиться к переменной а мы уже не сможем, пока не объявим ее еще раз где-то еще. Если мы хотим выполнить функцию func2(), которая запускает выполнение func1(), и хотим использовать именно переменную a = 42 внутри func2(), можно воспользоваться командой nonlocal a

Пример

def func2():
    def func1():
        nonlocal a
        a = 42
 
    a = 29
    func1()
 
    print(a)
 
func2() #На экране увидим не 29, а 42.

Global scope

Теория

Здесь располагаются имена, объявленные непосредственно в считываемых модулях. По сути, они располагаются в блоке __main__ [1] данного модуля. Поиск имен переменных здесь будет осуществляться в том случае, когда искомых имен не было ни в во внутренней области видимости, ни в нелокальной.

Полезный синтаксис

По аналогии с nonlocal, можно внутри функции менять значение переменной, находящейся в global scope. Как нетрудно догадаться, этой командой будет global a.

Пример

def func1():
    global a
    a = 42
 
a = 29
func1()
 
print(a) #42!

Built-in scope

Теория

Внешняя область видимости - это пространство имен, содержащее встроенные в язык Python имена переменных. К этим именам можно обращаться в любом месте программы без их предварительного объявления. На самом деле, эти имена содержатся в модуле builtins [2]. В случае, если переменные с такими же именами будут явно объявлены в коде, в качестве значения таких переменных будет взято именно объявленное.

Пример

False, True, None, range и многое другое.

Общий пример

def scope_test():
    def do_local():
        spam = 'local spam'
    def do_nonlocal ( ) :
        nonlocal spam
        spam = 'nonlocal spam'
    def do_global():
        global spam
        spam = 'global spam'
 
    spam = 'test spam'
    do_local()# 'test spam', потому что то, что мы сделали внутри функции, остается внутри функции
    print ('After local assignment: ', spam)
    do_nonlocal()# 'nonlocal spam', потому что мы хотели поменять spam в nonlocal scope и поменяли
    print( 'After nonlocal assignment: ', spam)
    do_global() # 'nonlocal spam', потому что мы хотели поменять spam в global scope, а в nonlocal scope больше не трогали
    print('After global assignment: ', spam)
 
scope_test() # 'global spam', потому что do_global все-таки сработала
print ('In global scope: ', spam)

Ссылки

  1. документация языка Python, https://docs.python.org/3/library/__main__.html#module-__main__
  2. Модуль builtins, https://docs.python.org/3/library/builtins.html#module-builtins