Что будет, если в теле функции использовать переменную, не определённую внутри неё?

Если в теле функции используется переменная, не определённая внутри неё, Python будет искать её в окружающих областях видимости (enclosing scopes), а затем в глобальной области видимости и во встроенной области видимости. Если переменная не будет найдена ни в одной из этих областей, возникнет исключение NameError.

Если в теле Python функции использовать переменную, не определённую внутри этой функции, Python будет искать эту переменную в окружающих областях видимости, в соответствии с правилом LEGB (Local, Enclosing, Global, Built-in):

  • Local (Локальная): Сначала Python ищет переменную в локальной области видимости функции, то есть внутри самой функции.
  • Enclosing (Охватывающая): Если переменная не найдена локально, Python ищет её в области видимости охватывающей функции (например, во вложенных функциях). Если функций несколько, поиск идет снизу вверх по вложению.
  • Global (Глобальная): Если переменная не найдена в охватывающей области видимости, Python ищет её в глобальной области видимости, то есть в области видимости модуля, где определена функция.
  • Built-in (Встроенная): Если переменная не найдена и в глобальной области видимости, Python ищет её во встроенной области видимости, содержащей предопределенные имена, такие как print, len и т.д.

Если переменная не найдена ни в одной из этих областей видимости, Python вызовет исключение NameError. Это означает, что переменная, которую вы пытаетесь использовать, не была определена.

Пример:


x = 10

def my_function():
  print(x)  # x не определена внутри my_function, но определена в глобальной области видимости

my_function() # Выведет 10

def another_function():
  print(y) # y не определена ни в локальной, ни в охватывающей, ни в глобальной, ни во встроенной области видимости

another_function() # Вызовет NameError: name 'y' is not defined

  

Важно! Если вы присваиваете значение переменной внутри функции, Python считает её локальной переменной. Чтобы изменить глобальную переменную изнутри функции, нужно использовать ключевое слово global.

0