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 来明确表示修改的是全局变量。