Статья Автор: Александр Ф. Алейников

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

Глобальные переменные

Глобальными называются переменные, объявленные в основной программе и доступные как программе, так и всем ее функциям.

Рассмотрим следующий программный код:

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 и e =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 птиц.
Печать