Автор оригинала: 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
Использование глобальных переменных на практике
Использование и изменение глобальных переменных из внутренних функций рассматривается как очень плохой стиль программирования, поскольку он вызывает побочные эффекты, которые довольно трудно обнаружить. Вместо этого настоятельно рекомендуется использовать правильные параметры функции.
Признание
Автор хотел бы поблагодарить Мэнди Ноймайер за ее поддержку при подготовке статьи.
Ссылки и ссылки
- Бернд Клейн: Глобальные, локальные и нелокальные переменные, https://www.python-course.eu/python3_global_vs_local_variables.php
- Переменная область применения и срок службы, Кейптаунский университет, http://python-textbok.readthedocs.io/en/1.0/Variables_and_Scope.html
- Python 3: globals(), https://docs.python.org/3/library/functions.html#globals
- Python3: locals(), https://docs.python.org/3/library/functions.html#locals