У меня однажды была такая же проблема, как и у вас, и чтение следующего раздела из Norman Matloff Краткое и безболезненное руководство по Python действительно помогло мне. Вот что вам нужно понять (скопировано из книги Матлоффа):
Python действительно не допускает глобальные переменные в том смысле, в каком это делает C / C ++. Импортированный модуль Python не будет иметь прямого доступа к глобальным переменным в модуле, который его импортирует, и наоборот.
Например, рассмотрим эти два файла: x.py ,
# x.py
import y
def f():
global x
x = 6
def main():
global x
x = 3
f()
y.g()
if __name__ == ’__main__’:
main()
и y.py :
# y.py
def g():
global x
x += 1
Переменная x в x.py видна по всему модулю x.py , но не в y.py . На самом деле, исполнение линии
х + = 1
в последнем случае появится сообщение об ошибке, «глобальное имя’ x ’не определено».
Действительно, глобальная переменная в модуле - это просто атрибут (то есть элемент-член) этого модуля, аналогичный роли переменной класса в классе. Когда модуль B импортируется модулем A , пространство имен B копируется в A . Если модуль B имеет глобальную переменную X, то модуль A создаст переменную с таким именем, начальное значение которой равно модулю B для его переменной это имя во время импорта. Но изменения X в одном из модулей НЕ будут отражены в другом.
Скажем, X изменяется в B , но мы хотим, чтобы код в A позволял получить последнее значение X в B . Мы можем сделать это, включив функцию, скажем, с именем GetX () в B . Предполагая, что A импортирует все из B , тогда A получит функцию GetX () , которая является копией B Функция с этим именем, единственная цель которой - вернуть значение X. Если B не изменит эту функцию (что возможно, например, функции могут быть назначены), функции в двух модули всегда будут одинаковыми, поэтому A может использовать свою функцию для получения значения X в B .