内嵌函数和闭包
global关键字:内部作用域想要对外部作用域的变量进行修改时需要用到。
内嵌函数:内部函数作用域在外部函数作用域之内,且只能在外部函数内调用内部函数。
闭包:在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。
nonlocal关键字:可以在嵌套函数中修改嵌套作用域中的变量
----------------------分割线,哈哈哈---------------------------------
二、课后作业:
0.如果希望在函数中修改全局变量的值,应该使用什么关键字?
global
1.在嵌套的函数中,如果希望在内部函数修改外部函数的局部变量,应该使用什么关键字?
nonlocal
2.Python函数可以嵌套,但要注意访问的作用域问题哦,请问以下代码存在什么问题?
>>> def outside():
print('I am outside!')
def inside():
print('I am inside!')
>>> inside()
inside()是内嵌在outside()函数中的,不能在外部调用。
3.请问为什么代码A没有报错,但代码B却报错了?应该如何修改?
代码A:
>>> def outside():
var = 5
def inside():
var = 3
print(var)
inside()
>>> outside()
代码B:
>>> def outside():
var = 5
def inside():
print(var)
var = 3
inside()
>>> outside()
代码B中内嵌函数中的的var变量没有声明就调用,python为了保护变量的作用域,会将外部函数outside()的var变量屏蔽,因此嵌套函数无法访问到外部函数的var变量。如果要修改,可以使用nonlocal关键字。
修改如下:
>>> def outside():
var = 5
def inside():
nonlocal var
print(var)
var = 3
inside()
>>> outside()
4.请问如何访问funIn()呢?
>>> def funOut():
def funIn():
print('宾果!你成功访问到我啦!')
return funIn()
>>> funOut()
宾果!你成功访问到我啦!
5.请问如何访问funIn()呢?
>>> def funOut():
def funIn():
print('宾果!你成功访问到我啦!')
return funIn
>>> funOut()()
宾果!你成功访问到我啦!
6.以下是“闭包”的一个例子,请你目测下会打印什么内容?
>>> def funX():
x = 5
def funY():
nonlocal x
x += 1
return x
return funY
>>> a = funX()
>>> print(a())
6
>>> print(a())
7
>>> print(a())
8
当a=funX()的时候,只要a变量没有被重新赋值,funX()就没有被释放,也就是说局部变量x没有被重新初始化。所以说当全局变量不适用的时候,可以考虑使用闭包更安全稳定。
转载于:https://blog.51cto.com/wszzdanm/2164597