我对全局变量的工作原理有点困惑。我有一个大项目,大约有50个文件,我需要为所有这些文件定义全局变量。
我所做的就是在项目main.py文件中定义它们,如下所示:
# ../myproject/main.py
# Define global myList
global myList
myList = []
# Imports
import subfile
# Do something
subfile.stuff()
print(myList[0])
我试图在subfile.py中使用myList,如下所示
# ../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写入或pickle,这是我不想做的。
基于上面的答案和链接,我创建了一个名为global_variables.py的新模块:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ==============================================================================
#
# global_variables.py - Global variables shared by all modules.
#
# ==============================================================================
USER = None # User ID, Name, GUID varies by platform
def init():
""" This should only be called once by the main module
Child modules will inherit values. For example if they contain
import global_variables as g
Later on they can reference 'g.USER' to get the user ID.
"""
global USER
import getpass
USER = getpass.getuser()
# End of global_variables.py
然后在我的主模块中,我使用这个:
import global_variables as g
g.init()
在另一个子导入模块,我可以使用:
import global_variables as g
# hundreds of lines later....
print(g.USER)
我只花了几分钟在两个不同的python多模块程序中测试,但到目前为止,它工作得很完美。
当您从配置导入mySharedThing时,会出现命名空间噩梦。这一点再怎么强调也不为过。
使用from in other places也可以。
你甚至可以有一个完全空的配置模块。
# my_config.py
pass
# my_other_module.py
import my_config
def doSomething():
print(my_config.mySharedThing.message)
# main.py
from dataclasses import dataclass
from my_other_module import doSomething
import my_config
@dataclass
class Thing:
message: str
my_config.mySharedThing = Thing('Hey everybody!')
doSomething()
结果:
$ python3 main.py
Hey everybody!
但是使用你从那里拉来的物品会让你陷入沮丧。
# my_other_module.py
from my_config import mySharedThing
def doSomething():
print(mySharedThing.message)
结果:
$ python3 main.py
ImportError: cannot import name 'mySharedThing' from 'my_config' (my_config.py)
也许你会尝试这样修正它:
# my_config.py
mySharedThing = None
结果:
$ python3 main.py
AttributeError: 'NoneType' object has no attribute 'message'
然后您可能会找到这个页面,并尝试通过添加init()方法来解决它。
但问题在于。
你可以把Python的全局变量看作是“模块”变量——因此,它们比C语言中传统的“全局变量”有用得多。
全局变量实际上是在模块的__dict__中定义的,可以从模块外部作为模块属性访问。
所以,在你的例子中:
# ../myproject/main.py
# Define global myList
# global myList - there is no "global" declaration at module level. Just inside
# function and methods
myList = []
# Imports
import subfile
# Do something
subfile.stuff()
print(myList[0])
And:
# ../myproject/subfile.py
# Save "hey" into myList
def stuff():
# You have to make the module main available for the
# code here.
# Placing the import inside the function body will
# usually avoid import cycles -
# unless you happen to call this function from
# either main or subfile's body (i.e. not from inside a function or method)
import main
main.mylist.append("hey")