- 自由变量:未在本地作用域中定义的变量。例如定义在内存函数外的外层函数的作用域中的变量
- 闭包:出现在嵌套中,指的是内层函数引用到了外层函数的自由变量,就形成了闭包。
- 如图,列表c就是自由变量,在inc函数中,我们发现直接+1 ,竟然没有报错,此时c[0]只是引用的元素,没有重新定义其c变量本身,此时就形成了闭包,当我们调用了两次foo(),这个引用元素就加了2次1,等于了12.
- 这里又出现了一个问题,这里的c只是引用类型的,只修改元素的情况下确实可以做到闭包,那我们想对普通变量使用闭包呢?这里要引出新的关键字nonlocal关键字
nonlocal关键字
- 使用了nonlocal关键字,将变量标记在上级的局部作用域中定义,但不能在全局作用域定义
- 如图,在counter()的内部函数inc()里面使用了nonlocal即可,如果在counter下面调用就是错误的,如下图
- 此时a就调用了全局变量,这是错误的
每天的内容简单点,轻松点!