Python для начинающих: Функции, пространства имен и области видимости

Этот урок посвящен функциям в Python, локальным и глобальным переменным, пространствам имен и областям видимости.

Локальные переменные

Переменные, созданные и используемые внутри функции, являются локальными. Они существуют только внутри функции, где определены.

Пример:

def fun(x1, x2):
    c = x1 + x2
    d = x1 * x2
    return c, d

print(fun(3, 4)) # Выведет (7, 12)
print(c) # Выведет ошибку, так как переменная c локальна

Пространства имен и область видимости

Пространство имен — это место, где существуют имена объектов (переменных). Объект существует с момента присвоения ему значения.

Область видимости определяет, где имя объекта доступно коду. Эти понятия тесно связаны.

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

Переменная, определенная вне функции, является глобальной. Ее можно использовать внутри функции.

Пример:

a = 2000

def fun(x1, x2):
    c = x1 + x2 + a
    return c

print(fun(3, 4)) # Выведет 2007

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

a = 2000

def fun(x1, x2):
    a = 1000 # Создается локальная переменная a
    c = x1 + x2 + a
    return c

print(fun(3,4)) # Выведет 1007
print(a) # Выведет 2000 - глобальная переменная не изменилась

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

a = 2000

def fun(x1, x2):
    global a
    a = 1000
    c = x1 + x2 + a
    return c

print(fun(3, 4)) # Выведет 1007
print(a) # Выведет 1000 - глобальная переменная изменена

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

a = [1, 2, 3]

def fun():
    a[1] = 85

fun()
print(a) # Выведет [1, 85, 3]

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

a = [1, 2, 3]

def fun():
    a = [10, 20, 30]

fun()
print(a) # Выведет [1, 2, 3] - глобальный список не изменился

Для изменения всего списка внутри функции, необходимо также использовать global:

a = [1, 2, 3]

def fun():
    global a
    a = [10, 20, 30]

fun()
print(a) # Выведет [10, 20, 30] - глобальный список изменен

Функции locals() и globals()

Функции locals() и globals() возвращают словари локального и глобального пространств имен соответственно:

global_var = 333333
list_nm = [1, 2, 3]

def my_fun():
    local_var = 23
    print(locals())
    print(globals())

my_fun()

Порядок поиска имен

При обращении к имени переменной, Python ищет ее в следующем порядке:

  1. Локальная область видимости: внутри текущей функции.
  2. Локальная область видимости объемлющей функции: внутри функции, содержащей текущую функцию (для вложенных функций).
  3. Глобальная область видимости: внутри текущего модуля (файла .py).
  4. Встроенная область видимости: стандартный модуль builtins.

Понимание пространств имен и областей видимости является важным аспектом программирования на Python. Ключевое слово global позволяет управлять доступом к глобальным переменным из функций. Функции locals() и globals() предоставляют информацию о текущих пространствах имен.

Что будем искать? Например,программа