Одним из основных элементов языков программирования являются переменные. Проще говоря, переменная – это уровень абстракции для ячеек памяти, которые содержат фактическое значение. Нам, как разработчику, легче запомнить имя ячейки памяти, чем ее физический адрес. Допустимое имя может состоять из символов от «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
Использование на практике
Использование и изменение глобальных переменных из внутренних функций считается очень плохим стилем программирования, поскольку вызывает побочные эффекты, которые довольно сложно обнаружить. Вместо этого настоятельно рекомендуется использовать правильные параметры функции.