ПРИМЕЧАНИЕ. Существует аналогичный вопрос с ответом, который не отвечает на мой вопрос или является неправильным: Как изменить переменную модуля из другого модуля?
У меня есть 2 модуля:
module1::G_VAR # module global
module1::G_VAR_changer() # changes the module global
module2::call_G_VAR_changer() # calls G_VAR_changer()
Это работает:
# from module2:
# call_G_VAR_changer() -> module1::G_VAR_changer() -> module1::G_VAR *is changed*
Это не работает:
# from module1:
import module2
# module2::call_G_VAR_changer() -> module1::G_VAR_changer() -> module1::G_VAR *is NOT changed*
Код:
module1.py
import module2
def call_G_VAR_changer():
print('m1: before: m2.G_VAR: ' + module2.G_VAR)
module2.G_VAR_changer()
print('m1: after: m2.G_VAR: ' + module2.G_VAR)
if __name__ == '__main__':
print('m1: before: m2.G_VAR: ' + module2.G_VAR)
call_G_VAR_changer()
print('m1: after: m2.G_VAR: ' + module2.G_VAR)
module2.py
import module1
G_VAR='default'
def G_VAR_changer():
print('m2.G_VAR_changer')
global G_VAR
G_VAR='changed'
if __name__ == '__main__':
print('m2: before: m2.G_VAR: ' + G_VAR)
module1.call_G_VAR_changer()
print('m2: after: m2.G_VAR: ' + G_VAR)
Работает:
$ python3 module1.py
m1: before: m2.G_VAR: default
m1.call_G_VAR_changer
m1: before: m2.G_VAR: default
m2.G_VAR_changer
m1: after: m2.G_VAR: changed
m1: after: m2.G_VAR: changed # !!! the changer function changed it
Это не работает:
$ python3 module2.py
m2: before: m2.G_VAR: default
m1.call_G_VAR_changer
m1: before: m2.G_VAR: default
m2.G_VAR_changer
m1: after: m2.G_VAR: changed # it seems it managed to change the value
m2: after: m2.G_VAR: default # !!! but it failed to change it
ВОПРОС:
Меня интересуют как объяснение, так и обходной путь.
ПРИМЕЧАНИЯ:
Обратите внимание, что module1 импортирует module2, и наоборот, таким образом, существует циклический импорт. Я проверил это без циклического импорта, и он отлично работает.
Я также пытался протестировать из-за того, что есть как-то 2 экземпляра / пространства имен с 2 различными G_VAR-ами, но мои эксперименты ни к чему не привели.
Я подозреваю, что эта проблема сводится к циклической ссылке и каким-то образом к пространству имен.
Я даже не знаю, является ли это ожидаемым поведением, или, возможно, ошибка в python?
Версия Python: Python 3.5.3