在python中,在函数外部定义的变量是全局变量。
全局变量可以在函数内部引用。
g_var = 1
def test():
print(g_var)
在函数内部引用全局变量,如果不修改,可以不用 global 关键字声明。以上代码,因为在 test 函数内部,g_var 变量没有定义,自然用外部定义的全局变量g_var 。
在python 中,一旦,引用了全局变量,再给一个与这个全局变量同名的 g_var 变量赋值,就会发生 UnboundLocalError: local variable 'g_var' referenced before assignment,理由是在函数内部给变量赋值意味着定义一个本地局部变量,这个变量就会被当做局部变量,如果这个变量在赋值前就被引用,则会出现异常。
解决问题的原理是:
如果这个变量是全局变量,就应该在使用前(引用与修改)用 global关键字申明;如果是局部变量,就应该在引用前定义。定义在函数外面的变量默认是全局变量,可以在函数内部进行访问和修改(必须 global 申明)。但是如果在函数内部重新定义了一个名称相同的局部变量,那么它会覆盖掉全局变量,函数内部只能访问和修改局部变量,而不能访问全局变量。如果要修改一个全局变量,必须在函数内部用 global 来声明该全局变量。
例如:
g_var = 1
def test():
global g_var
g_var = g_var + 5
print(g_var)
以上函数,如果不用 global 来申明 g_var 为全局变量,则 g_var = g_var + 5 语句不能执行,会产生异常。理由是 表达式 g_var + 5 是引用变量,而 g_var = 表示定义一个变量,在函数内部就是定义局部变量,在函数内部已经把 g_var 当作局部变量了,但 = 后面的 g_var + 5 又引用了该局部变量,所以就发生了“局部变量在赋值前被引用的”异常。解决办法是,用 global关键字声明该变量。
nonlocal变量
在Python中,除了global关键字,还有一个关键字叫做nonlocal,也可以在嵌套函数中访问外层函数中的变量。global关键字用于访问全局变量,而nonlocal关键字用于访问嵌套函数中的变量。
global 与 nolocal 的区别在于,使用nonlocal关键字声明的变量,可以在内嵌函数内部和外部函数中进行共享。而global关键字声明的变量是全局变量,能在整个程序中共享。
下面的示例程序演示了nonlocal的用法。
def outer_func():
x = 100
def inner_func():
nonlocal x
x += 1
return x
return inner_func()
print(outer_func()) # 输出101
在上述代码中,我们定义了一个outer_func()函数和inner_func()函数,inner_func()函数访问和修改了outer_func()函数中定义的局部变量x,通过nonlocal关键字声明的变量x,可以在内嵌inner_func()函数和外部函数outer_func()函数中共享。
- 使用global关键字可以在函数内部访问和修改全局变量;使用global关键字声明的全局变量的范围为可以在整个程序中共享。
- 使用nonlocal关键字可以在嵌套函数中访问和修改外层函数中的变量;使用nonlocal关键字声明的变量的范围为可以在嵌套函数内部和外部进行共享。