Модуль 1.4 Пространства имён и области видимости
В какой момент создается локальное пространство имен для функции?
В момент вызова функции
Какие числа будут выведены на экран в результате выполнения данного кода?
x, y = 1, 2 def foo(): global y if y == 2: x = 2 y = 1 foo() print(x) if y == 1: x = 3 print(x)Описание решения:
Давайте разберем шаги выполнения программы:x, y = 1, 2
: Создаются две переменныеx
иy
и присваиваются значения 1 и 2 соответственно.def foo():
: Определение функцииfoo
.global y
: Внутри функцииfoo
объявляется, что будет использоваться глобальная переменнаяy
, а не создаваться новая локальная переменнаяy
внутри функции.if y == 2:
: Проверка условия. Если значение глобальной переменнойy
равно 2, выполняется блок кода внутри условия.x = 2
: Создается новая локальная переменнаяx
и ей присваивается значение 2 (не глобальная переменнаяx
, так как она не объявлена как глобальная).y = 1
: Глобальной переменнойy
присваивается новое значение 1.foo()
: Вызывается функцияfoo
, которая изменяет значения переменныхx
иy
внутри себя.print(x)
: Выводится значение переменнойx
после выполнения функцииfoo
. Здесь используется глобальная переменнаяx
, и ее значение не изменилось внутри функцииfoo
. Поэтому будет выведено значение глобальной переменнойx
, равное 1.if y == 1:
: Проверка условия. Если глобальная переменнаяy
равна 1, выполняется блок кода внутри условия.x = 3
: Глобальной переменнойx
присваивается новое значение 3.print(x)
: Выводится значение переменнойx
после выполнения второго блока кода. Здесь используется глобальная переменнаяx
, и ее значение изменилось в блоке кода после выполнения функцииfoo
. Поэтому будет выведено значение глобальной переменнойx
, равное 3.
1, 3
Реализуйте программу, которая будет эмулировать работу с пространствами имен. Необходимо реализовать поддержку создания пространств имен и добавление в них переменных.
В данной задаче у каждого пространства имен есть уникальный текстовый идентификатор – его имя.
Вашей программе на вход подаются следующие запросы:
Описание:
- create <namespace> <parent> – создать новое пространство имен с именем <namespace> внутри пространства <parent>
- add <namespace> <var> – добавить в пространство <namespace> переменную <var>
- get <namespace> <var> – получить имя пространства, из которого будет взята переменная <var> при запросе из пространства <namespace>, или None, если такого пространства не существует
Код осуществляет эмуляцию работы с пространствами имен. Программа обрабатывает запросы, которые могут быть созданием пространства имен (create
), добавлением переменной в пространство имен (add
), и получением имени пространства, из которого будет взята переменная (get
). Родительские пространства имен и их переменные хранятся в словаряхparent
иvs
соответственно. При запросеget
, программа проверяет, содержится ли переменная в текущем пространстве имен или его родителях, и выводит имя пространства, из которого будет взята переменная.
# Ввод числа запросов n = int(input()) # Словарь для хранения родительских пространств имен parent = {"global": None} # Словарь для хранения переменных в каждом пространстве имен vs = {"global": set()} # Обработка каждого запроса for _ in range(n): t, fst, snd = input().split() # Создание нового пространства имен if t == "create": parent[fst] = snd vs[fst] = set() # Добавление переменной в пространство имен elif t == "add": vs[fst].add(snd) # Получение имени пространства, из которого будет взята переменная elif t == "get": while fst is not None: # Проверка, содержится ли переменная в текущем пространстве if snd in vs[fst]: break # Переход к родительскому пространству fst = parent[fst] # Вывод результата print(fst)
Если у вас не отображается решение последних задач, значит у вас включен блокировщик рекламы который вырезает эти ответы