Python 不同模块之间的全局变量共享行为不同
在config.py中,我有:Python 不同模块之间的全局变量共享行为不同,python,Python,在config.py中,我有: config = 0 #config = [] def init_config(): global config config = 1 #config.append("1") print("init", config) from config import init_config from config import config def main(): init_config() print("main", c
config = 0
#config = []
def init_config():
global config
config = 1
#config.append("1")
print("init", config)
from config import init_config
from config import config
def main():
init_config()
print("main", config)
if __name__ == '__main__':
main()
在main.py中,我有:
config = 0
#config = []
def init_config():
global config
config = 1
#config.append("1")
print("init", config)
from config import init_config
from config import config
def main():
init_config()
print("main", config)
if __name__ == '__main__':
main()
同一目录中的config.py和main.py。运行python main.py
后,我得到:
init 1
main 0
但如果改用config.py中的注释行,我会得到:
init ['1']
main ['1']
那么,为什么会出现这种差异呢?(Python 3.5.5)一旦从
config.py
导入,变量config
将成为config.config
的一个单独副本,它位于main.py
的命名空间中。您应该将config
作为模块导入,然后将变量config
作为模块config
的属性访问:
import config
def main():
config.init_config()
print("main", config.config)
if __name__ == '__main__':
main()
@EugeneSh可能重复。您好,我已经重申了我的问题。您能解释一下为什么使用list修改的代码是可以的吗?这是因为list变量实际上只存储对list的引用,所以当您从
config
模块导入config
作为列表时,即使您正在将config
模块中的config
变量复制到main.py
的命名空间中,该值的副本仍在内存中引用相同的列表,因此在这种情况下,修改config
模块中的列表仍然可以通过main.py
中config
变量的副本进行访问。