Область видимости переменных
@ProgHelpBotОбласть видимости или 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