Discuss / Python / 结合评论区记录三种方法

结合评论区记录三种方法

Topic source

豆糕啊

#1 Created at ... [Delete] [Delete and Lock User]

#方法一:使用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 #注意外函数返回内函数时,内函数名后不能有()

大神!

插个眼学习了

世事逝时

#3 Created at ... [Delete] [Delete and Lock User]

好厉害

小宝12216

#4 Created at ... [Delete] [Delete and Lock User]

请问为什么第一种方法里每次调用createCounter()函数时为什么a的值都会保存上一次调用的的a的值,而不会因为a=0语句导致a的值归零啊

且看风吟0

#5 Created at ... [Delete] [Delete and Lock User]

分析的十分到位,受教了

常小毫

#6 Created at ... [Delete] [Delete and Lock User]

求大神指正,谢谢

def createCounter(a):

    def counter(b):

        print(a+b)

    return counter

counterA = createCounter(0)

同样想问:为什么第一种方法里每次调用createCounter()函数时为什么a的值都会保存上一次调用的的a的值,而不会因为a=0语句导致a的值归零?

为之彷徨-

#8 Created at ... [Delete] [Delete and Lock User]

感觉是不是局部变量在调用的时候发现没有定义,就从已经用过这个变量名的上一次运算空间去找?结果就变成了全局变量?

为之彷徨-

#9 Created at ... [Delete] [Delete and Lock User]

a每次没有变成0,因为没有再执行a=0这个语句了啊,a每次被用到就会在系统形成一个数字,变成了全局变量


  • 1

Reply