本文转载于https://blog.csdn.net/qq_27825451/article/details/79964128,并对代码格式做了修正。
1、global关键字的作用
如果在函数中需要修改全局变量,则需要使用该关键字,具体参见下面例子
那如果不再函数内部重新为全局变量赋值,又想改变全局变量的值,应该怎么做呢?这就要使用global关键字了,如下。
variable=100def function(): global variable #使用global关键字,表明variable是全局的, #此时就可以了直接在函数局部作用域内改变variable的值了 variable+=111 print(variable) #输出211function()print(variable) #输出211,这和上面的不一样了,发现全局变量variable本身也改变了总结:global的作用就是在“函数局部作用域”内声明表示一个全局变量,从而可以在函数内部修改全局变量的值(否则只能访问不能修改),而且函数内部改变的全局变量的值也会改变。
2、函数局部作用域
函数的局部作用域是不能够保存信息的,即在函数内部声明变量在函数调用结束之后函数里面保存的信息就被销毁了,包括函数的参数,如下。
3、闭包——装饰器的本质也是闭包
“闭包”的本质就是函数的嵌套定义,即在函数内部再定义函数,如下所示。
“闭包”有两种不同的方式,第一种是在函数内部就“直接调用了”;第二种是“返回一个函数名称”。
(1)第一种形式——直接调用
(2)第二种形式——返回函数名称
def Maker(name): num=100 def func1(weight,height,age): weight+=1 height+=1 age+=1 print(name,weight,height,age) return func1 #此处不直接调用,而是返回函数名称(Python中一切皆对象)maker=Maker('feifei') #调用包装器maker(100,200,300) #调用内部函数(3)“闭包”的作用——保存函数的状态信息,使函数的局部变量信息依然可以保存下来,如下。
def Maker(step): #包装器 num=1 def fun1(): #内部函数 nonlocal num #nonlocal关键字声明的变量不是局部变量,也不是全局变量, #而是外部嵌套函数内的变量。它用法和前面的global是类似的, #如果不使用该关键字,则不能在内部函数改变“外部变量”的值 num=num+step #改变外部变量的值 #如果只是访问外部变量,则不需要适用nonlocal print(num) return fun1#=====================================#j=1func2=Maker(3) #调用外部包装器while(j<5): func2() #调用内部函数4次 输出的结果是 4、7、10、13 j+=1从上面的例子可以看出,外部装饰器函数的局部变量num=1、以及调用装饰器Maker(3)时候传入的参数step=3都被记忆了下来,所以才有1+3=4、4+3=7、7+3=10、10+3=13.
从这里可以看出,Maker函数虽然调用了,但是它的局部变量信息却被保存了下来,这就是“闭包”的最大的作用——保存局部信息不被销毁。
4、python装饰器
python装饰器本质上就是闭包。关于装饰器,这篇讲的很好:
https://www.zhihu.com/question/26930016/answer/1047233982