一:global:在函数内部引用/声明全局变量
在自定义函数时,有时候需要引用函数外的一些全局变量,如果不需要修改全局变量的内容,则可以直接引用,像下面这样:
c = 999 def func(): print(c) if __name__ == '__main__': func()
函数的作用只是输出变量 c 的值,并未对 c 进行修改,所以不会报错。但如果想要在函数内部对全局变量进行一个修改,则需要使用global关键字,
c = 999 def func(): for i in range(10): c += 1 if __name__ == '__main__': func() print(c)。
上面的代码中,在func函数中尝试修改 c 这个变量,但会出现如下错误:
UnboundLocalError: local variable 'c' referenced before assignment
意思是:赋值之前引用了局部变量。global关键字可以解决这个问题,如下:
c = 999 def func(): global c # 在修改前使用global关键字 for i in range(10): c += 1 if __name__ == '__main__': func() print(c)
另外,global还可以帮助我们在函数内部声明一个全局变量,如下:
def func(): global c # 在函数内部声明一个全局变量 c = 100 if __name__ == '__main__': func() print(c)
二:nonlocal关键字
nonlocal的作用于global类似,只不过global是在函数内部引用/修改全局变量,而nonloca是在内层函数中引用/修改外层函数定义的局部变量(非全局变量)。这种现象也成为闭包。
def func(): c = 100 def foo(): for i in range(10): # 对外层函数的c变量进行修改 c += 1 foo() print(c) if __name__ == '__main__': func()
报错如下:
UnboundLocalError: local variable 'c' referenced before assignment
与上面的错误相同,但这时候不能再使用global关键字了,而要使用nonlocal关键字,(如果使用了global,则相当于又声明的一个新的变量)
def func(): c = 100 def foo(): nonlocal c for i in range(10): # 对外层函数的c变量进行修改 c += 1 foo() print(c) if __name__ == '__main__': func()
这样就不会报错了,输出结果是110.
总的来说:global关键字用来在函数或其它局部作用域中使用全局变量。但是如果不使用全局变量也可以不适用global关键字声明,nonlocal关键字用来在函数或其它作用域中使用外层(非全局)变量。
****************不积跬步无以至千里****************