多语言展示
当前在线:867今日阅读:165今日分享:48

python 3 函数作用域的正确使用

本经验介绍在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

如图也是一个常见的通过闭包生成不同功能函数的使用情景。相当于先确定函数的部分参数。

注意事项

如果遇到问题,可以在下面提出疑问。

推荐信息