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

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

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

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

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

Благодарности

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

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

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus