В таком простом примере реальный ответ в большинстве случаев заключается в использовании аргументов функции (как уже упоминалось). Но если бы смысл состоял в том, чтобы проверить правила области видимости Python, то я думаю, что могу уточнить ...
Если вы думаете из контекста C / C ++, вы легко можете быть озадачены тем, как работает импорт Python. Импорт модулей не работает как директивы #include. В C / C ++ компилятор будет использовать директивы #include в качестве маркеров для вставки исходного кода из других файлов исходного / заголовочного файла в текущий исходный файл (это собственная локальная копия включенного источника). В результате при компиляции глобальные переменные будут выделены для этого модуля компиляции, который включает в себя весь #included источник. Вы можете сделать несколько грязных трюков с порядком #include, чтобы создать действительно трудный для понимания код. :-P
Импорт Python не предоставляет экземпляр локального модуля, который разделяет область действия модуля импорта. Вместо этого он предоставляет ссылку на объект одноэлементного модуля, который используется в текущем выполнении интерпретатора. Объект модуля создается при первом импорте. Последующие импорты, будь то в том же модуле или из совершенно разных модулей, просто получают ссылку на этот же объект модуля. «Глобальный» является глобальным в своем модуле. Из других модулей он будет доступен только через ссылку на этот модуль. Например, в a.py вам потребуется импортировать b, чтобы получить доступ к значению «bar».
В вашем примере вы не должны этого делать, поскольку у вас будет циклический импорт. Если вам действительно нужно установить состояние модуля, вы можете установить модуль global из модуля b: a.bar = bar
(ад зависимости последовательности).
Не меняйте a.py,
def foo():
print bar
но измените b.py на:
import a
a.bar = "baz"
a.foo()
В лучше инкапсулированном примере a.py предоставляет функцию для установки своего глобального состояния, чтобы b.py мог просто выполнить a.set_module_state( "baz" )
.