#方法一:使用nonlocal关键字声明内函数的变量
def createCounter():
a=0
def counter():
nonlocal a #nonlocal声明这个变量不是局部变量空间的变量,需要向上一个层级变量空间找这个变量
a=a+1
return a
return counter
#方法二:使用可变类型数据的闭包变量,如list。方法一和二本质上是一样的,都是在内函数中修改外函数的闭包变量。有两种方法进行修改,一是使用nonlocal关键字在内函数中进行声明,另一种是使用可变类型的数据作为闭包变量,此时在内函数中可以直接修改这个变量的值
c=[0]
c[0]+=1
return c[0]
#方法三:使用generator及next()生成一个计数器
def iterator(): #定义一个生成器,逐个生成1,2,3...自然数序列
n=0
while True:
n+=1
yield n
g=iterator() #需声明一个变量g指向生成器
return next(g)
return counter #注意外函数返回内函数时,内函数名后不能有()
大神!
插个眼学习了
好厉害
请问为什么第一种方法里每次调用createCounter()函数时为什么a的值都会保存上一次调用的的a的值,而不会因为a=0语句导致a的值归零啊
分析的十分到位,受教了
求大神指正,谢谢
def createCounter(a):
def counter(b):
print(a+b)
counterA = createCounter(0)
同样想问:为什么第一种方法里每次调用createCounter()函数时为什么a的值都会保存上一次调用的的a的值,而不会因为a=0语句导致a的值归零?
感觉是不是局部变量在调用的时候发现没有定义,就从已经用过这个变量名的上一次运算空间去找?结果就变成了全局变量?
a每次没有变成0,因为没有再执行a=0这个语句了啊,a每次被用到就会在系统形成一个数字,变成了全局变量
Sign in to make a reply
豆糕啊
#方法一:使用nonlocal关键字声明内函数的变量
def createCounter():
a=0
def counter():
nonlocal a #nonlocal声明这个变量不是局部变量空间的变量,需要向上一个层级变量空间找这个变量
a=a+1
return a
return counter
#方法二:使用可变类型数据的闭包变量,如list。方法一和二本质上是一样的,都是在内函数中修改外函数的闭包变量。有两种方法进行修改,一是使用nonlocal关键字在内函数中进行声明,另一种是使用可变类型的数据作为闭包变量,此时在内函数中可以直接修改这个变量的值
def createCounter():
c=[0]
def counter():
c[0]+=1
return c[0]
return counter
#方法三:使用generator及next()生成一个计数器
def createCounter():
def iterator(): #定义一个生成器,逐个生成1,2,3...自然数序列
n=0
while True:
n+=1
yield n
g=iterator() #需声明一个变量g指向生成器
def counter():
return next(g)
return counter #注意外函数返回内函数时,内函数名后不能有()