В этом уроке мы разберем одну из фундаментальных тем Python — область видимости переменных (Scope). Вы узнаете, почему переменные, созданные внутри функции, не видны снаружи, как работать с глобальными переменными и что такое правило LEGB (Local, Enclosing, Global, Built-in).
Основные моменты:
- Локальная область (Local): Переменные, объявленные внутри функции. Они доступны только там.
- Глобальная область (Global): Переменные, объявленные на уровне основной программы. Доступны везде (для чтения).
- Shadowing (Затенение): Если внутри функции создать переменную с тем же именем, что и глобальная, она "перекроет" глобальную внутри этой функции.
- Ключевые слова: global и nonlocal.
Вам предстоит решить ряд задач: от предсказания результата работы кода до исправления ошибок и сборки правильных конструкций. Будьте внимательны к отступам и ключевым словам!
- Модуль 1: Основы синтаксиса Python
- Модуль 2: Переменные и типы данных
- Модуль 3: Операторы
- Арифметические операторы (+, -, *, /).
- Целочисленное деление и остаток (// и %).
- Возведение в степень (**).
- Операторы сравнения.
- Логические операторы (and, or, not).
- Операторы присваивания (=, +=, -=).
- Операторы принадлежности (in, not in).
- Операторы идентичности (is, is not).
- Битовые операторы.
- Тернарный оператор.
- Модуль 4: Ввод и вывод данных
- Модуль 5: Условные конструкции
- Модуль 6: Циклы
- Модуль 7: Строки
- Модуль 8: Списки
- Модуль 9: Кортежи
- Модуль 10: Словари
- Модуль 11: Множества
- Модуль 12: Функции
- Модуль 13: Встроенные функции
- Модуль 14: Работа с файлами
- Модуль 15: Обработка исключений
- Модуль 16: Модули и пакеты
- Модуль 17: ООП - Основы
- Модуль 18: ООП - Продвинутый уровень
- Модуль 19: Декораторы
- Модуль 20: Генераторы и итераторы
- Модуль 21: Регулярные выражения
- Модуль 22: Дата и время
- Модуль 23: Математические операции
- Модуль 24: Работа с сетью
- Модуль 25: Асинхронное программирование
- Модуль 26: Многопоточность
- Модуль 27: Тестирование
- Модуль 28: Базы данных
- Модуль 29: Алгоритмы и структуры данных
- Модуль 30: Продвинутые возможности
Локальная или Глобальная?
Посмотрите на код. Переменная message объявлена внутри функции. Что произойдет при попытке вывести её значение вне функции?
def say_hello():
message = "Hello World"
print(message)
say_hello()
print(message)Типы областей видимости
Распределите примеры переменных по их областям видимости: Локальная (Local) или Глобальная (Global).
# В начале файлаx = 100def my_func(arg): y = 20 print(arg + y)print(x)Создание локальной копии
Мы хотим создать локальную переменную points внутри функции, которая не повлияет на глобальную переменную с таким же именем. Заполните пропуск, чтобы присвоить локальной переменной значение 50.
points = 100 # Глобальная переменная
def update_score():
# Создаем локальную переменную, не меняя глобальную
input1S = 50
print(f"Inside: {points}")
update_score()
print(f"Outside: {points}")Что выведет код? (Затенение)
Проанализируйте код. Обратите внимание, что внутри функции foo происходит присваивание переменной a. Как это повлияет на вывод?
a = 1
def foo():
a = 5
print(a)
foo()
print(a)Изменение глобальной переменной
Допишите функцию increment, чтобы она увеличивала глобальный счетчик counter. Вам нужно явно указать Python, что мы хотим работать с глобальной переменной, а не создавать новую локальную.
counter = 0
def increment():
input1S input2S
counter += 1
increment()
print(counter)Ошибка UnboundLocalError
Этот код вызывает ошибку. Мы пытаемся напечатать переменную x, а затем присвоить ей значение. Python видит присваивание и считает x локальной, но в момент `print` она еще не создана. Исправьте код так, чтобы он выводил глобальную переменную, а затем создавал локальную. (Подсказка: просто поменяйте имя локальной переменной на другое, например y).
x = 10def check(): print(x) # Пытаемся читать глобальную x = 20 # Но тут же создаем локальную с тем же именем! Ошибка.check()Соберите функцию приветствия
Соберите код, в котором есть глобальная переменная admin_name и функция greet, принимающая имя пользователя. Функция должна выводить приветствие. Одна строка лишняя (создает конфликт имен).
print(f"Hello, {name}. Admin is {admin_name}")admin_name = "SuperUser"def greet(name):greet("User")admin_name = "Hacker"Ключевые слова и их значение
Сопоставьте ключевые слова Python, связанные с областью видимости, с их описанием.
defglobalnonlocalВычислите результат (LEGB Rule)
Чему будет равна переменная res после выполнения кода? Введите число.
x = 10
def outer():
x = 20
def inner():
return x + 5
return inner()
res = outer()
print(res)