Область видимости переменных

Область видимости переменных

@ProgHelpBot
  1. Глобальный контекст
  2. Локальный контекст
  3. Скрытие переменных
  4. nonlocal

Область видимости или scope определяет контекст переменной, в рамках которого ее можно использовать. Есть два типа контекста: глобальный и локальный.

Глобальный контекст

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

name = "Alex"  # Глобальная переменная


def say_hello():
  print(f"Hello, {name}")


def say_bye():
  print(f"Bye, {name}")


say_hello()  # Hello, Alex
say_bye()  # Bye, Alex

Локальный контекст

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

def say_hello():
  name = "Alex"  # Локальная переменная
  print(f"Hello, {name}")


def say_bye():
  name = "Alice"  # Локальная переменная
  print(f"Bye, {name}")


say_hello()  # Hello, Alex
say_bye()  # Bye, Alice

Скрытие переменных

Локальная переменная может скрывать глобальную с тем же именем.

name = "Alex"


def say_hello():
  name = "Bill"
  print(f"Hello, {name}")


def say_bye():
  print(f"Bye, {name}")


say_hello()  # Hello, Bill
say_bye()  # Bye, Alex

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

name = "Alex"


def say_hello():
  global name
  name = "Bill"
  print(f"Hello, {name}")


def say_bye():
  print(f"Bye, {name}")


say_hello()  # Hello, Bill
say_bye()  # Bye, Bill

nonlocal

Ключевое слово nonlocal указывает, что идентификатор во вложенной функции будет представлять переменную из окружающей функции.

def outer():
  n = 5

  def inner():
    nonlocal n
    n = 6  # Значение изменяется и для inner() и для outer()
    return n

  print(inner())
  print(n)


outer()

Результат:

6
6

Если записать тот же пример без использования ключевого слова, то значение для переменно n изменится только для функции inner().

def outer():
  n = 5

  def inner():
    n = 6  # Значение изменяется только для inner()
    return n

  print(inner())
  print(n)


outer()

Результат:

6
5


← Преобразование типов

→ Замыкания

Report Page