global
и nonlocal
для доступа к переменным из внешней области видимости.
global
используется для доступа к глобальной переменной из локальной области видимости.nonlocal
используется для доступа к переменной из ближайшей внешней неглобальной области видимости (например, внутри вложенной функции).global
и nonlocal
.
Вопрос о работе с переменными из разных областей видимости, когда они перекрываются, в Python затрагивает понимание ключевых слов global
и nonlocal
, а также правила LEGB (Local, Enclosing, Global, Built-in).
Ключевые слова global
и nonlocal
:
global
: Используется для доступа и изменения глобальных переменных внутри функций. Без global
внутри функции, если присвоить значение переменной с именем, совпадающим с глобальной, будет создана локальная переменная с таким же именем. Использование global
говорит интерпретатору, что нужно работать с переменной из глобальной области видимости.nonlocal
: Используется внутри вложенных функций (функций внутри функций) для доступа и изменения переменных из ближайшей неглобальной области видимости (enclosing scope). По сути, позволяет "подняться" на один уровень вверх по областям видимости. Если nonlocal
не указан, будет создана локальная переменная внутри вложенной функции.Примеры:
Пример с global
:
global_var = 10
def my_function():
global global_var # Указываем, что работаем с глобальной переменной
global_var = 20 # Изменяем глобальную переменную
print(f"Внутри функции: {global_var}")
my_function()
print(f"Вне функции: {global_var}") # Выведет 20
Пример с nonlocal
:
def outer_function():
outer_var = 10
def inner_function():
nonlocal outer_var # Указываем, что работаем с переменной из outer_function
outer_var = 20 # Изменяем переменную outer_var
print(f"Внутри inner_function: {outer_var}")
inner_function()
print(f"Внутри outer_function: {outer_var}") # Выведет 20
outer_function()
Что произойдет, если не использовать global
или nonlocal
:
global_var = 10
def my_function():
global_var = 20 # Создается ЛОКАЛЬНАЯ переменная global_var
print(f"Внутри функции: {global_var}")
my_function()
print(f"Вне функции: {global_var}") # Выведет 10 (глобальная переменная не изменилась)
Рекомендации:
global
и nonlocal
. Они могут сделать код сложнее для понимания и отладки.В заключение, Python предоставляет инструменты для работы с переменными из разных областей видимости, но их следует использовать осознанно и с пониманием последствий.