Глобальные переменные
Глобальными называются переменные, объявленные в основной программе и доступные как программе, так и всем ее функциям.
Рассмотрим следующий программный код:
birds = 5000
def print_texas():
print('В Техасе обитает', birds, 'птиц.')
def print_california():
print('В Калифорнии обитает', birds, 'птиц.')
В самом начале программы создаем глобальную переменную birds, значение которой равно 5000. Далее описываем две функции, обращающиеся к глобальной переменной.
Приведённый ниже код:
print_texas()
print_california()
выводит:
В Техасе обитает 5000 птиц.
В Калифорнии обитает 5000 птиц.
Обмен информацией между основной программой и функциями осуществляется только с помощью параметров функций и глобальных переменных.
Функция может использовать любые глобальные переменные кроме имеющих те же имена, что и ее локальные переменные. Если в функции объявлена локальная переменная с тем же именем, что у одной из глобальных, то данная глобальная переменная становится недоступной в этой функции, и при указании идентификатора переменной произойдет обращение к локальной переменной функции, а не одноименной глобальной.
Рассмотрим следующий программный код:
birds = 5000
def print_texas():
birds = 1000
print('В Техасе обитает', birds, 'птиц.')
def print_california():
birds = 7000
print('В Калифорнии обитает', birds, 'птиц.')
В самом начале программы мы создаем глобальную переменную birds, значение которой равно 5000. Далее мы описываем две функции, в которых создаются локальные переменные с таким же именем birds. Таким образом при обращении к переменной birds внутри функций будет происходить обращение именно к локальной переменной.
Приведённый ниже код:
print_texas()
print_california()
выводит:
В Техасе обитает 1000 птиц.
В Калифорнии обитает 7000 птиц.
Глобальные переменные – зло
Большинство программистов согласны, что следует ограничить использование глобальных переменных либо не использовать их вообще. Причины следующие.
- Глобальные переменные затрудняют отладку программы. Значение глобальной переменной может быть изменено любой инструкцией в программном файле. Если обнаружится, что в глобальной переменной хранится неверное значение, то придется отыскать все инструкции, которые к ней обращаются, чтобы определить, откуда поступает плохое значение. В программе с тысячами строк кода сделать это непросто.
- Функции, использующие глобальные переменные, обычно зависят от этих переменных. Если возникнет необходимость применить такую функцию в другой программе, скорее всего придется эту функцию перепроектировать, чтобы она не опиралась на глобальную переменную.
- Глобальные переменные затрудняют понимание программы. Глобальная переменная может быть модифицирована любой инструкцией в программе. При необходимости разобраться в какой-то части программы, использующей глобальную переменную, придется узнать обо всех других частях программы, обращающихся к этой глобальной переменной.
В большинстве случаев следует создавать переменные локально и передавать их в качестве аргументов в функции, которым нужно к ним обратиться.
Глобальные константы
Хотя следует избегать использования глобальных переменных, в программе допускается применение глобальных констант. Глобальная константа – глобальное имя, ссылающееся на неизменное значение. Поскольку значение глобальной константы не может быть изменено во время исполнения программы, можно не беспокоиться о потенциальных опасностях, обычно связанных с использованием глобальных переменных.
Несмотря на то, что язык Python не позволяет создавать настоящие глобальные константы, их можно имитировать при помощи глобальных переменных. Если глобальная переменная не объявляется с использованием ключевого слова global внутри функции, то внутри этой функции вы никак не сможете изменить значение этой глобальной переменной.
Математический модуль math определяет две глобальные переменные, math.pi и math.e, которым присвоены математические значения констант =3.14159265 и =2.71828.
Ключевое слово global
Если нужно, чтобы инструкция внутри функции присваивала значение глобальной переменной, то требуется дополнительный шаг. В этом случае глобальная переменная должна быть объявлена внутри функции.
Рассмотрим следующий программный код:
def print_texas():
global birds
birds = 5000
print('В Техасе обитает', birds, 'птиц.')
def print_california():
print('В Калифорнии обитает', birds, 'птиц.')
print_texas()
print_california()
Приведённый ниже код:
print_texas()
print_california()
выводит:
В Техасе обитает 5000 птиц.
В Калифорнии обитает 5000 птиц.