Python 3.x 为什么在导入函数中定义的函数中更新全局变量不起作用
我试图理解为什么下面的方法不起作用。我有两个文件:Python 3.x 为什么在导入函数中定义的函数中更新全局变量不起作用,python-3.x,Python 3.x,我试图理解为什么下面的方法不起作用。我有两个文件:app.py和config.py,我试图通过调用app.py中定义的函数来设置全局变量。这根本不起作用。预计产量为全球2 主文件(app.py): 辅助文件(config.py): 输出全局1。global\u name值的更改在外部不可见 更让我困惑的是,如果我将init_global()移动到app.py我会收到global 2的预期输出。此版本pfapp.py工作正常: from config import global_name def
app.py
和config.py
,我试图通过调用app.py
中定义的函数来设置全局变量。这根本不起作用。预计产量为全球2
主文件(app.py
):
辅助文件(config.py
):
输出全局1。global\u name
值的更改在外部不可见
更让我困惑的是,如果我将init_global()
移动到app.py
我会收到global 2的预期输出。此版本pfapp.py
工作正常:
from config import global_name
def init_global(name: str):
global global_name
global_name = name
def main():
init_global("Global 2")
print(global_name)
main()
Python总是假定在函数中分配的任何变量都是该函数的局部变量。因此,当您将
global\u name
分配给global 2
时,Python会创建一个覆盖全局变量的局部变量。由于Python的垃圾收集系统,这个局部变量超出了范围,无法从app.py
访问。但是,可以通过config.py
访问它!因此,您可以在config.py
中添加一个helper函数,该函数将返回正确的值:
#config.py
全局名称:str=“全局1”
def初始_全局(名称:str):
全局名称
全局名称=名称
def get_name():
返回全局名称
#app.py
从配置导入全局名称,获取全局名称,初始化全局名称
def main():
init_global(“global 2”)
打印(获取名称())
main()
我有一个答案给你。:)您可以简单地将所有配置变量写入json或python文件,并读取app.py中的所有变量。如果您计划添加许多变量,可以泛化我编写的helper函数。@GraphicalDot在字典中添加所有值不是更容易吗?@GraphicalDot这是一个简单的版本。实际上,config是一个公共模块中的类,每个微服务都会覆盖它。但为了好玩,我创建了一个新服务,它确实需要使用特定的类,并发现了这个问题。请不要假设答案,干杯。
global_name: str = "Global 1"
def init_global(name: str):
global global_name
global_name = name
from config import global_name
def init_global(name: str):
global global_name
global_name = name
def main():
init_global("Global 2")
print(global_name)
main()