Область видимости переменных

Тренажер по Python для пользователей с начальным уровнем подготовки.

Тренажер по Python

В этом уроке мы разберем одну из фундаментальных тем Python — область видимости переменных (Scope). Вы узнаете, почему переменные, созданные внутри функции, не видны снаружи, как работать с глобальными переменными и что такое правило LEGB (Local, Enclosing, Global, Built-in).

Основные моменты:

  • Локальная область (Local): Переменные, объявленные внутри функции. Они доступны только там.
  • Глобальная область (Global): Переменные, объявленные на уровне основной программы. Доступны везде (для чтения).
  • Shadowing (Затенение): Если внутри функции создать переменную с тем же именем, что и глобальная, она "перекроет" глобальную внутри этой функции.
  • Ключевые слова: global и nonlocal.

Вам предстоит решить ряд задач: от предсказания результата работы кода до исправления ошибок и сборки правильных конструкций. Будьте внимательны к отступам и ключевым словам!

Список тем

Локальная или Глобальная?

id: 40041_task_scope_predict_1

Посмотрите на код. Переменная message объявлена внутри функции. Что произойдет при попытке вывести её значение вне функции?

Выберите правильный вариант ответа
def say_hello():
    message = "Hello World"
    print(message)

say_hello()
print(message)
Сообщения
Проверить
Показать подсказку

Типы областей видимости

id: 40041_task_scope_sort_1

Распределите примеры переменных по их областям видимости: Локальная (Local) или Глобальная (Global).

Перетяните элементы в соответствующие блоки
Глобальная (Global)
Локальная (Local)
# В начале файла
x = 100
def my_func(arg):
    y = 20
    print(arg + y)
print(x)
Сообщения
Проверить
Показать подсказку

Создание локальной копии

id: 40041_task_scope_replace_1

Мы хотим создать локальную переменную points внутри функции, которая не повлияет на глобальную переменную с таким же именем. Заполните пропуск, чтобы присвоить локальной переменной значение 50.

Заполните пропуски
points = 100  # Глобальная переменная

def update_score():
    # Создаем локальную переменную, не меняя глобальную
    input1S = 50
    print(f"Inside: {points}")

update_score()
print(f"Outside: {points}")
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Что выведет код? (Затенение)

id: 40041_task_scope_predict_2

Проанализируйте код. Обратите внимание, что внутри функции foo происходит присваивание переменной a. Как это повлияет на вывод?

Выберите правильный вариант ответа
a = 1

def foo():
    a = 5
    print(a)

foo()
print(a)
Сообщения
Проверить
Показать подсказку

Изменение глобальной переменной

id: 40041_task_scope_bank_1

Допишите функцию increment, чтобы она увеличивала глобальный счетчик counter. Вам нужно явно указать Python, что мы хотим работать с глобальной переменной, а не создавать новую локальную.

Нужно правильно расставить в пропуски предложенные варианты
counter = 0

def increment():
    input1S input2S
    counter += 1

increment()
print(counter)
global
counter
return
local
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Ошибка UnboundLocalError

id: 40041_task_scope_error_1

Этот код вызывает ошибку. Мы пытаемся напечатать переменную x, а затем присвоить ей значение. Python видит присваивание и считает x локальной, но в момент `print` она еще не создана. Исправьте код так, чтобы он выводил глобальную переменную, а затем создавал локальную. (Подсказка: просто поменяйте имя локальной переменной на другое, например y).

Найдите ошибку и исправьте
x = 10
def check():
    print(x) # Пытаемся читать глобальную
    x = 20   # Но тут же создаем локальную с тем же именем! Ошибка.
check()
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Соберите функцию приветствия

id: 40041_task_scope_bfp_1

Соберите код, в котором есть глобальная переменная admin_name и функция greet, принимающая имя пользователя. Функция должна выводить приветствие. Одна строка лишняя (создает конфликт имен).

Перетяните в правильном порядке строки из одного блока в другой
print(f"Hello, {name}. Admin is {admin_name}")
admin_name = "SuperUser"
def greet(name):
greet("User")
admin_name = "Hacker"
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Ключевые слова и их значение

id: 40041_task_scope_compare_1

Сопоставьте ключевые слова Python, связанные с областью видимости, с их описанием.

Сопоставьте строки в правой части с соответствующими строками в левой по порядковому номеру
Позволяет изменять переменную из глобальной области
Позволяет изменять переменную из внешней (не глобальной) функции
Создает новую локальную область видимости
def
global
nonlocal
Сообщения
Проверить
Показать подсказку

Вычислите результат (LEGB Rule)

id: 40041_task_scope_give_result_1

Чему будет равна переменная res после выполнения кода? Введите число.

Что должно получиться?
x = 10

def outer():
    x = 20
    def inner():
        return x + 5
    return inner()

res = outer()
print(res)
Сообщения
Проверить
Показать подсказку
НайтиКурс.Ру