先看个小栗子
a = 1
def func1():
print(a) # 1
func1()
#############################
b = 100
def func2():
b += 1 # 报错 UnboundLocalError: local variable 'b' referenced before assignment
func2()
局部作用域对全局作用域的变量(此变量只能是不可变的数据类型)只能进行引用,而不能进行改变,只要改变就会报错,但是有些时候,我们程序中会遇到局部作用域去改变全局作用域的一些变量的需求,这怎么做呢?这就得用到关键字 global。
global 作用
-
1.声明一个全局变量。
def func(): global a a = 3 func() print(a) # 3
-
2.在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)。
count = 1 def search(): global count count = 2 search() print(count) # 2
nonlocal 作用
nonlocal 是 Python3.x 新加的功能,与 global 用法差不多,就是在局部作用域中如果想对父级作用域的变量进行改变时,需要用到 nonlocal。
-
1.不能更改全局变量。
count = 666 def func1(): def func2(): nonlocal count # SyntaxError: no binding for nonlocal 'count' found count += 1 print(count) func2() func1()
-
2.在局部作用域中,对父级作用域(或者更外层作用域,非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。
def func1(): count = 666 def inner(): print(count) def func2(): nonlocal count count += 1 print('func2', count) func2() print('inner', count) inner() print('func1', count) func1() # 运行结果: # 666 # # func2 667 # # inner 667 # # func1 667