Python 不同模块之间的全局变量共享行为不同

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.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()
在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
变量的副本进行访问。