Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 为什么在导入函数中定义的函数中更新全局变量不起作用_Python 3.x - Fatal编程技术网

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的预期输出。此版本pf
app.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()