Почему в импортированных функциях недоступно глобальное пространство имён?

Есть два файла: file1.py

a = 123
from file2 import foo

def bar():
    print(a)

print(globals())

bar()
foo()

И file2.py

def foo():
    print(a)

Вывод globals() показывает, что a, foo и bar находятся в одном пространстве имён:

{... 'a': 123, 'foo': <function foo at 0x0000021C8D5F5940>, 'bar': <function bar at 0x0000021C8D5F58B0>}

Тем не менее, bar() работает, а foo() выдаёт ошибку:

Traceback (most recent call last):
  File "F:\Информация\Programs\Sort\Kodex\file1.py", line 10, in <module>
    foo()
  File "F:\Информация\Programs\Sort\Kodex\file2.py", line 3, in foo
    print(a)
NameError: name 'a' is not defined

Я читал во многих местах, что при импорте модуля python выполняет весь код в нём. В чём тогда причина такой дискриминации?

Знаю, что такой код не пишут в реальных проектах. Меня интересует именно техническая сторона данной ошибки. Почему в импортированных функциях недоступно глобальное пространство имён (даже если сами функции находятся в нём)? Почему область видимости ограничена только file1.py?


Ответы (0 шт):