global和nonlocal的作用这里看一个基本的例子:
首先在函数外定义一个变量,内部函数去访问
a = 1
def f1():
def f2():
a = 3 # 这里的a和函数外面的a是不一致的,可以看打印结果
print('a in f2:', a)
f2()
print('a in f1 : ', a) # 在函数内可以打印a,但是不能够运算
f1()
打印结果:
a in f2: 3
a in f1 : 1
可以明显的看到函数外面的a是1,而f2函数中又定义了a=3的值,但是不影响函数外面a的值,说明了函数内部的a是独立的
2、如果改成这样的代码:
a = 1
def f1():
def f2():
a += 3
print("a in f2: ", a)
f2()
print('a in f1 : ', a) # 在函数内可以打印a,但是不能够运算
f1()
print("函数外a:", a)
结果会报错,说局部变量a在赋值前被引用。因为函数外面的a不是全局变量,这个时候想要改变a的值怎么办,或者要用a的值,
场景一:
第一种就是重新在函数内写一个a,还有就是定义全局变量global
a = 1
def f1():
def f2():
global a # 定义全局变量
a += 3
print("a in f2: ", a)
a = 10
f2()
print('a in f1 : ', a) # 在函数内可以打印a,但是不能够运算
f1()
print("函数外:", a)
结果:
a in f2: 4
a in f1 : 10
函数外: 10
但是这样就改变原始a的值,并且在定义一个值时,后续的函数在调用a的值时,有可能得到不想要的值,所以global
一般不要用。
场景二:
如果在函数内部定义一个变量呢:
代码如下:
def f1():
a = 1
def f2():
a = 2
f2()
print('a in f1 : ',a)
f1()
结果:
a in f1 : 1
可以看出虽然在f2函数定义了一个a,但是在外面打印的时候还是1
如果在f2里面加上nonlocal
呢,再看下:这里最外面也加上a
a = 0
def f1():
a = 1
def f2():
nonlocal a
a += 2
f2()
print('a in f1 : ',a)
f1()
print('函数外a值:', a)
结果:
a in f1 : 3
函数外a值: 0
总结:
nonlocal:只改变函数里面的变量,但是不会影响函数最外面的变量值a=0
global: 在全局都会起作用,无论在函数内还是函数外一旦改变,全局都可以用