day8.总结与理解
Topic sourcenonlocal关键字声明的变量,它既不是局部变量,也不是全局变量,需要向上一层变量空间找这个变量。方法一中,用到这种类型变量需要用nonlocal特别声明;方法二、四中用到了可变变量L是一个局部变量,在Python中,定义了一个变量(局部变量或者可区分的全局变量)且已赋值,那么它的类型就已经确定了,不需要我们定义或声明。
主要是可变,list本身就是可变数据结构,而第一种方法,如果不加nonlocal,每次调用createCounter(),变量x都会置为0;而加了nonlocal,每次调用createCounter(),x都会置于上次计算返回的x值
感谢您的总结,非常有帮助。还有两个不太懂的地方想请教一下:1)例子中count()函数的例子中,在内部函数中使用外部函数的循环变量i,为什么不需要在内部函数中重新使用nonlocal申明呢?2)如果是外部函数的参数,为什么也不需要再在内部函数中使用nonlocal申明,而可以直接调用呢?
- 1
- 2
小太郎tail
关于闭包,我查阅了很多资料,也看了评论区很多大佬的发言,这里总结一下关于作业的四种方法以及我的理解。
对于闭包的理解:在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样就构成了一个闭包。(这里的引用就是内函数的函数名)
#方法一:利用nonlocal关键字声明变量x,既不是局部变量,也不是全局变量,需要向上一层变量空间找这个变量。只在闭包里面生效,只能用在嵌套函数中,是python3中新添的关键字,python2中无。(作用理解是:x保存内函数counter每次作用后返回的值,比如第一次x=0,counter()后,x=0+1=1,counter()后,x=1+1=2......以此类推)
'''def createCounter():
x=0
def counter():
nonlocal x
x=x+1
return x
return counter'''
#方法二:利用可变数据类型list
'''def createCounter():
L=[0] #初始化列表L为0
def counter():
L[0]+=1 #L[0]指的是列表L的第一个元素,为一个可变变量
return L[0]
return counter'''
#方法三:利用生成器
def createCounter():
def g(): #生成器生成有序数列1,2,3......
n=0
while 1:
n+=1
yield n
a=g()
def counter():
return next(a) #每次调用next()函数获得生成器的下一个返回值
return counter
#方法四:利用len()
def createCounter():
L=[]
def counter():
L.append(9) #这里只是为了补位,添加任何一个数字都可以的
return len(L)
return counter