Область видимости (scope) в Python определяет контекст, в котором имя переменной доступно и может быть использовано. Это своеобразный "контейнер" для переменных, определяющий, где они могут быть найдены и изменены.
В Python существует четыре основных типа областей видимости (LEGB):
print(), len()) и констант (например, True, False, None).  Эти имена доступны в любой части программы.Порядок поиска переменных определяется правилом LEGB: Python сначала ищет переменную в локальной области видимости, затем в объемлющей функции, затем в глобальной области видимости и, наконец, в встроенной области видимости. Если переменная не найдена ни в одной из этих областей, возникает ошибка NameError.
Ключевые слова global и nonlocal:
global: Используется для указания, что переменная, используемая внутри функции, является глобальной переменной, определенной вне функции. Это позволяет функции изменять значение глобальной переменной.nonlocal: Используется для указания, что переменная, используемая внутри вложенной функции, находится в области видимости объемлющей функции, но не является глобальной. Это позволяет вложенной функции изменять значение переменной в объемлющей функции.Пример:
    
      x = 10 # Глобальная переменная
      def outer_function():
          y = 20 # Переменная в объемлющей функции
          def inner_function():
              nonlocal y
              y = 30  # Изменяем переменную y в объемлющей функции
              print("inner:", y) # Вывод: inner: 30
          inner_function()
          print("outer:", y) # Вывод: outer: 30
      outer_function()
      print("global:", x) # Вывод: global: 10
    
  
  Понимание областей видимости очень важно для написания чистого, понятного и предсказуемого кода. Правильное использование областей видимости помогает избежать конфликтов имен и делает код более модульным и поддерживаемым.