Я немного озадачен тем, как работают глобальные переменные. У меня большой проект, содержащий около 50 файлов, и мне нужно определить глобальные переменные для всех этих файлов.
Я определил их в main.py
файле моих проектов следующим образом:
# ../myproject/main.py
# Define global myList
global myList
myList = []
# Imports
import subfile
# Do something
subfile.stuff()
print(myList[0])
Я пытаюсь использовать myList
в subfile.py
, следующим образом
# ../myproject/subfile.py
# Save "hey" into myList
def stuff():
globals()["myList"].append("hey")
Другой способ, которым я пытался, но тоже не работал
# ../myproject/main.py
# Import globfile
import globfile
# Save myList into globfile
globfile.myList = []
# Import subfile
import subfile
# Do something
subfile.stuff()
print(globfile.myList[0])
И внутри у subfile.py
меня было это:
# ../myproject/subfile.py
# Import globfile
import globfile
# Save "hey" into myList
def stuff():
globfile.myList.append("hey")
Но опять же, это не сработало. Как мне это реализовать? Я понимаю, что это не может работать так, когда два файла на самом деле не знают друг друга (хорошо, подфайл не знает основной), но я не могу придумать, как это сделать, не используя io write или pickle, что Я не хочу делать
NameError: name 'myList' is not defined
соmain.py
строкиprint(globfile.myList[0])
Ответы:
Проблема в том , вы определили
myList
отmain.py
, ноsubfile.py
нужно использовать. Вот простой способ решить эту проблему: переместить все глобальные переменные в файл, я называю этот файлsettings.py
. Этот файл отвечает за определение глобалов и их инициализацию:Далее вы
subfile
можете импортировать глобалы:Обратите внимание, что
subfile
не вызываетinit()
- эта задача принадлежитmain.py
:Таким образом, вы достигаете своей цели, избегая инициализации глобальных переменных более одного раза.
источник
init()
материал. Модули оцениваются только в первый раз, когда они импортируются, поэтому вполне нормально инициализировать эти переменные в теле модуля.См. Документ Python о совместном использовании глобальных переменных между модулями :
источник
x
помощьюfrom config import x
, используя толькоimport config
Вы можете думать о глобальных переменных Python как о «модульных» переменных - и поэтому они гораздо более полезны, чем традиционные «глобальные переменные» из C.
Глобальная переменная фактически определена в модуле
__dict__
и может быть доступна извне этого модуля как атрибут модуля.Итак, в вашем примере:
И:
источник
Использование
from your_file import *
должно исправить ваши проблемы. Он определяет все так, чтобы он был глобально доступен (за исключением локальных переменных в импорте, конечно).например:
и:
источник
import *
любой ценой, чтобы ссылки были явными (и не сбивающими с толку). Кроме того, когда вы когда-нибудь использовали все "*
" ссылки в каком-либо модуле?Hai Vu прекрасно работает, всего один комментарий:
Если вы используете глобальный модуль в другом модуле и хотите установить глобальный динамически, обратите внимание на импорт других модулей после установки глобальных переменных, например:
источник
Ваша вторая попытка будет работать отлично, и на самом деле это действительно хороший способ обработки имен переменных, которые вы хотите иметь глобально доступными. Но у вас есть ошибка имени в последней строке. Вот как это должно быть:
Видите последнюю строчку? myList является атрибутом globfile, а не subfile. Это будет работать, как вы хотите.
Майк
источник