内嵌函数和闭包

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没有被重新初始化。所以说当全局变量不适用的时候,可以考虑使用闭包更安全稳定。