Рубрики
Без рубрики

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

Автор оригинала: Frank Hofmann.

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

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

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

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

Интерпретатор Python создает три переменные age , name , и places , и присваивает значение 42 первой и “Dominic” второй переменной, и places становится списком из трех элементов, который содержит строки “Berlin”, “Cape Town” и “New York”.

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

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

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

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

info()

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

$ python3 global.py
Dominic is 42 years old.

Если быть более точным, каждый модуль, класс и функция имеют свое собственное пространство имен, и переменные локально привязаны к нему. В следующем примере мы используем два пространства имен – внешнее, глобальное из основной программы и внутреннее, локальное из функции с простым именем output() . Переменная place существует в основной программе (строка 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), а вторая-из оператора print в строке 3 функции output() . Сначала две переменные name и place определяются в основной программе (строки 6 и 7) и выводятся в stdout. Вызывая функцию output () , переменная place локально переопределяется в строке 2, а name вместо этого берется из глобального пространства имен. Это приводит к выходу, как показано ниже.

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

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

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

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

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

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

$ python3 globalscope.py
Berlin
Cape Town

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

Определение области действия переменной

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()

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

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

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

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

Признание

Автор хотел бы поблагодарить Мэнди Ноймайер за ее поддержку при подготовке статьи.

Ссылки и ссылки