Discuss / Python / 请问第一种方法里,调用后面的counterA()的时候,li为什么不会再定义为0?

请问第一种方法里,调用后面的counterA()的时候,li为什么不会再定义为0?

Topic source

ywjco_567

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

因为:createCounter1是个闭包函数。

def createCounter1():
    li = [0]
    def counter():
        li[0] += 1
        return li[0]
    return counter

1、li = [0] 定义了一个列表(li[0] == 0),这个列表是个容器,在counter函数里执行li[0] += 1,则函数外的li[0] 也会增加 1;

2、函数引用了li列表: 这个li是“局部作用域以外且非全局作用域当中的变量”----自由变量。(https://docs.python.org/zh-cn/3.7/reference/simple_stmts.html#nonlocal

3、闭包函数在return li[0]后,会保留着li的值,供下次使用。

4、要学会闭包函数,理解“自由变量”是关键。


  • 1

Reply