Шаг 122.
Основы языка Python.
Пользовательские функции. Глобальные и локальные переменные

    На этом шаге мы рассмотрим особенности использования локальных и глобальных переменных.

    Глобальные переменные - это переменные, объявленные в программе вне функции. В 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. Результат работы приложения

    Таким образом, поиск идентификатора, используемого внутри функции, будет производиться в следующем порядке:

  1. Поиск объявления идентификатора внутри функции (в локальной области видимости).
  2. Поиск объявления идентификатора в глобальной области.
  3. Поиск во встроенной области видимости (встроенные функции, классы и т. д.).

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

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
Архив с файлом можно взять здесь.

    Получить все идентификаторы и их значения позволяют следующие функции:

    На следующем шаге мы рассмотрим вложенные функции.




Предыдущий шаг Содержание Следующий шаг