本经验介绍在python 3 的编程当中,在闭包/嵌套等情况下,如何注意正确理解和使用函数作用域。
工具/原料
1
python 3
2
VSCode
方法/步骤
1
python的函数是first class的,可以像变量一样使用,也可以嵌套定义,如图所示。内层函数fb读取了外层变量var1的值。
2
如果内层函数对外层某个变量只有读取,如图fb读取外层var1变量,无需特别声明,在内层即可使用外层值。
3
但是,如果内层函数希望写外层变量的值,如图添加var1=6语句是不够的。这样会造成将var1变为内层变量,上一句读取语句也报错了。
4
如果希望在内层函数写外层变量,需要使用nonlocal关键字声明之。此时,读写var1会在外层寻找。
5
当有多个层次都有同名变量var1时,nonlocal会取最近一层的变量var1来用。如图,内层函数对最外层的全局var1无影响。
6
但是,如果想直接读写全局变量,则需要使用global关键字。此时,最内层函数直接读写全局var1。
7
python的函数可以作为返回值,也可以构造闭包。如图所示,使用counter_constructor构造了一个函数闭包,可以用来计数。
8
变量count_val相对于内层函数func会作为func的闭包一起返回,但是每次调用counter_constructor时,都会产生新的count_val。所以多个闭包互补干扰,有各自的count_val,如图所示。
9
如图也是一个常见的通过闭包生成不同功能函数的使用情景。相当于先确定函数的部分参数。
注意事项
如果遇到问题,可以在下面提出疑问。
上一篇:葱油蛋炒饭的做法
下一篇:web前端开发面试题