Одним из основных элементов языков программирования являются переменные. Проще говоря, переменная - это уровень абстракции для ячеек памяти, которые содержат фактическое значение. Нам, как разработчику, легче запомнить имя ячейки памяти, чем ее физический адрес. Допустимое имя может состоять из символов от «a» до «z» (как в нижнем, так и в верхнем регистрах), а также из цифр. В имени нельзя использовать пробелы или специальные символы, такие как умляуты и дефисы.
Кроме того, переменные имеют определенный тип данных, например строки (символы), цифры, списки или ссылки на другие переменные. В Python мы можем повторно использовать одну и ту же переменную для хранения значений любого типа. Тип автоматически определяется значением, присвоенным имени. Чтобы определить переменную с конкретным значением, просто присвойте это значение имени следующим образом:
age = 42
name = "Dominic"
places = ["Berlin", "Cape Town", "New York"]
Интерпретатор Python создает три переменные: age
, name
и places
,
и присваивает значение 42 первой переменной, а «Dominic» - второй
переменной, и places
становится списком из трех элементов, который
содержит строки «Berlin», «Cape Town». "и" Нью-Йорк ".
Пространства имён
Все указанные выше переменные являются частью одного и того же
пространства имен и, следовательно, имеют одинаковую область видимости.
Если позже не будет переопределена как локальная переменная, переменная,
определенная в основной программе, принадлежит глобальному пространству
имен, к которому может получить доступ любая функция в вашей программе
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) и
выводятся на стандартный вывод. При вызове функции 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
- Python 3: locals (), https://docs.python.org/3/library/functions.html#locals