Локальные и глобальные переменные в Python

Одним из основных элементов языков программирования являются переменные. Проще говоря, переменная – это уровень абстракции для ячеек памяти, которые содержат фактическое значение. Нам, как разработчику, легче запомнить имя ячейки памяти, чем ее физический адрес. Допустимое имя может состоять из символов от «a» до «z» (как в нижнем, так и в верхнем регистрах), а также из цифр. В имени нельзя использовать пробелы или специальные символы, такие как умляуты и дефисы.

Кроме того, переменные имеют определенный тип данных, например строки (символы), цифры, списки или ссылки на другие переменные. В Python мы можем повторно использовать одну и ту же переменную для хранения значений любого типа. Тип автоматически определяется значением, присвоенным имени. Чтобы определить переменную с конкретным значением, просто присвойте это значение имени следующим образом:

age = 42
name = "Dominic"
places = ["Berlin", "Cape Town", "New York"]

Интерпретатор Python создает три переменные: age, name и places, и присваивает значение 42 первой переменной, а «Dominic» — второй переменной, и places становится списком из трех элементов, который содержит строки «Berlin», «Cape Town». «и» Нью-Йорк «.

Пространства имён

Все указанные выше переменные являются частью одного и того же пространства имен и, следовательно, имеют одинаковую область видимости.

Если позже не будет переопределена, как локальная переменная, переменная, определенная в основной программе, принадлежит глобальному пространству имен, к которому может получить доступ любая функция в вашей программе Python. Следующий пример кода демонстрирует это и использует имя и возраст двух переменных в функции info().

age = 42
name = "Dominic"
places = ["Berlin", "Cape Town", "New York"]

def info():
    print("%s is %i years old." % (name, age))
    return

info()

Вывод состоит из единственной строки, которая поступает из оператора печати в функции info():

$ python3 global.py
Dominic is 42 years old.

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

В следующем примере мы используем два пространства имен – внешнее, глобальное, из основной программы, и внутреннее, локальное, из функции, названной просто output(). Место переменной существует в основной программе (строка 6) и переопределяется, как локальная переменная с новым значением в строке 2 функции output().

def output():
   place = "Cape Town"
   print("%s lives in %s." % (name, place))
   return

place = "Berlin"
name = "Dominic"
print("%s lives in %s." % (name, place))
output()

Вывод состоит из этих двух строк, при этом первая строка происходит из основной программы (строка 8), а вторая строка – из оператора печати в строке 3 функции output(). Сначала в основной программе определяются имя и место двух переменных (строки 6 и 7) и выводятся на стандартный вывод.

При вызове функции output() место переменной переопределяется в строке 2, а имя вместо этого берется из глобального пространства имен. Это приводит к выводу, как показано ниже.

$ python3 localscope.py
Dominic lives in Berlin.
Dominic lives in Cape Town.

Изменение глобальных переменных в другом пространстве имен

Доступ к значению глобальной переменной можно получить во всей программе. Чтобы добиться этого изнутри функций, Python предлагает использование ключевого слова global. Функция ниже демонстрирует, как ее использовать, и импортирует имя переменной в пространство имен функции:

def location():
    global place
    place = "Cape Town"
    return

place = "Berlin"
print(place)
location()
print(place)

Место переменной уже определено в основной программе (строка 6). Используя ключевое слово global в строке 2, переменная становится доступной в функции location() и может быть немедленно установлена на другое значение (строка 3). Вывод кода показан здесь:

$ python3 globalscope.py
Berlin
Cape Town

Без использования ключевого слова global, как показано в строке 2, место переменной будет рассматриваться, как локальная переменная в функции location(), а место переменной из основной программы тогда не изменится.

Как определить область действия?

Python имеет два встроенных метода с именами globals() и locals(). Они позволяют определить, является ли переменная частью глобального или локального пространства имен. В следующем примере показано, как использовать эти методы:

def calculation():
    "do a complex calculation"
    
    global place
    place = "Cape Town"
    name = "John"
    
    print("place in global:", 'place' in globals())
    print("place in local :", 'place' in locals())
    print("name in global :", 'name' in globals())
    print("name in local  :", 'name' in locals())
    return

place = "Berlin"
print(place)
calculation()

Результат выглядит следующим образом и показывает область действия двух переменных, места и имени внутри функции calculation():

$ python3 variablelist.py
Berlin
place in global: True
place in local : False
name in global : False
name in local  : True

Использование на практике

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *