На этом шаге мы рассмотрим особенности использования локальных и глобальных переменных.
Глобальные переменные - это переменные, объявленные в программе вне функции. В Python глобальные переменные видны в любой части модуля, включая функции.
def func(glob2): print("Значение глобальной переменной glob1 =", glob1) glob2 +=10 print("Значение локальной переменной glob2 =", glob2) glob1, glob2 = 10, 5 func(77) # Вызываем функцию print("Значение глобальной переменной glob2 =", glob2)
Результат выполнения примера приведен на рисунке 1.
Рис.1. Результат работы приложения
Переменной glob2 внутри функции присваивается значение, переданное при вызове функции. В результате создается новая переменная с тем же именем: glob2, которая является локальной. Все изменения этой переменной внутри функции не затронут значение одноименной глобальной переменной.
Итак, локальные переменные - это переменные, объявляемые внутри функций. Если имя локальной переменной совпадает с именем глобальной переменной, то все операции внутри функции осуществляются с локальной переменной, а значение глобальной переменной не изменяется. Локальные переменные видны только внутри тела функции.
def func(): local1 = 77 # Локальная переменная glob1 = 25 # Локальная переменная print("Значение glob1 внутри функции =", glob1) glob1 = 10 # Глобальная переменная func() # Вызываем функцию print("Значение glob1 вне функции =", glob1) try: print(local1) # Вызовет исключение NameError except NameError: # Обрабатываем исключение print("Переменная local1 не видна вне функции")
Результат выполнения примера приведен на рисунке 2.
Рис.2. Результат работы приложения
Как видно из примера, переменная local1, объявленная внутри функции func(), недоступна вне функции. Объявление внутри функции локальной переменной glob1 не изменило значения одноименной глобальной переменной.
Если обращение к переменной производится до присваивания значения (даже если существует одноименная глобальная переменная), то будет возбуждено исключение UnboundLocalError.
def func(): # Локальная переменная еще не определена print(glob1) # Эта строка вызовет ошибку!!! glob1 = 25 # Локальная переменная glob1 = 10 # Глобальная переменная func() # Вызываем функцию
Результат выполнения примера приведен на рисунке 3.
Рис.3. Результат работы приложения
Для того чтобы значение глобальной переменной можно было изменить внутри функции, необходимо объявить переменную глобальной с помощью ключевого слова global. Продемонстрируем это на примере.
def func(): # Объявляем переменную glob1 глобальной global glob1 glob1 = 25 # Изменяем значение глобальной переменной print("Значение glob1 внутри функции =", glob1) glob1 = 10 # Глобальная переменная print("Значение glob1 вне функции =", glob1) func() # Вызываем функцию print("Значение glob1 после функции =", glob1)
Результат выполнения примера приведен на рисунке 4.
Рис.4. Результат работы приложения
Таким образом, поиск идентификатора, используемого внутри функции, будет производиться в следующем порядке:
При использовании анонимных функций следует учитывать, что при указании внутри функции глобальной переменной будет сохранена ссылка на эту переменную, а не ее значение в момент определения функции:
x = 5 # Сохраняется ссылка, а не значение переменной х! func = lambda: x x = 80 # Изменили значение print (func()) # Выведет: 80, а не 5
Если необходимо сохранить именно текущее значение переменной, то можно воспользоваться способом, приведенным ниже.
x = 5 # Сохраняется значение переменной х func = (lambda y: lambda: y)(x) x = 80 # Изменили значение print(func()) # Выведет: 5
Обратите внимание на третью строку примера. В ней мы определили анонимную функцию с одним параметром, возвращающую ссылку на вложенную анонимную функцию. Далее мы вызываем первую функцию с помощью круглых скобок и передаем ей значение переменной x. В результате сохраняется текущее значение переменной, а не ссылка на нее.
Сохранить текущее значение переменной можно также, указав глобальную переменную в качестве значения параметра по умолчанию в определении функции.
x = 5 # Сохраняется значение переменной х func = lambda x=x: x x = 80 # Изменили значение print(func()) # Выведет: 5
Получить все идентификаторы и их значения позволяют следующие функции:
def func(): local1 = 54 glob2 = 25 print("Глобальные идентификаторы внутри функции") print(sorted(globals().keys())) print("Локальные идентификаторы внутри функции") print(sorted(locals().keys())) glob1, glob2 = 10, 88 func() print("Глобальные идентификаторы вне функции") print(sorted(globals().keys()))
Результат выполнения:
Рис.5. Результат работы приложения
def func(): local1 = 54 glob2 = 25 print("Локальные идентификаторы внутри функции") print(sorted(vars().keys())) glob1, glob2 = 10, 88 func() print("Глобальные идентификаторы вне функции") print(sorted(vars().keys())) print("Указание объекта в качестве параметра") print(sorted(vars(dict).keys())) print("Альтернативный вызов") print(sorted(dict.__dict__.keys()))
Результат выполнения:
Рис.6. Результат работы приложения
На следующем шаге мы рассмотрим вложенные функции.