global在外层函数和内层函数中的使用,通过定义全局变量在不同层级的函数中进行修改变量的值,在双层闭包函数中的应用

global在外层函数定义了全局变量后,在内层函数中进行使用的时候,也需要首先再次定义一下该变量,然后再进行变量值的修改。
不然python会认为你这是在创建一个新的局部变量。

Python 的变量作用域规则:

如果你在函数内赋值一个变量,Python 会认为你是定义了该函数的局部变量。
如果你想要修改全局变量 var,你必须在 inner 函数中使用 global var 来声明它为全局变量。
解决方案:
在 inner 函数中使用 global var 声明它是全局变量,这样 Python 就不会认为你是在创建一个新的局部变量,而是修改全局的 var。
修改后的代码:

def closure_func_global(num):
    global var  # 使用 global 使得 var 成为全局变量
    var = num + 3  # var 被定义为全局变量

    def inner():
        global var  # 在 inner 函数中声明 var 为全局变量
        print("在inner()内部之前, var = {}".format(var))  # 使用全局变量 var
        var = 2  # 修改全局 var,注意如果不修改外层函数变量的值是用不到global var的。
        print("在inner()内部之后, var = {}".format(var))  # 打印修改后的 var

    return inner
代码解释:
在 inner 函数中加上了 global var,这告诉 Python 在 inner 函数内访问和修改的是全局变量 var,而不是创建一个新的局部变量。
这样 inner 函数中的 var = 2 就会修改全局变量 var,而不会报错。
执行过程:

closure = closure_func_global(5)  # 调用 closure_func_global,num 为 5
closure()  # 执行 inner 函数
输出:
在inner()内部之前, var = 8
在inner()内部之后, var = 2
总结:
关键问题:在 inner 函数中对 var 赋值时,Python 默认认为 var 是一个局部变量。为了避免这种情况,必须使用 global var 来明确表示修改的是全局变量。

posted @ 2025-09-01 10:42  大海一个人听  阅读(6)  评论(0)    收藏  举报