本节将分析变量的作用域。
Python与大部分的编程语言一样,也有全局变量和局部变量。大体上来讲,在函数内定义的变量为局部变量,在函数外声明的变量为全局变量。局部变量的生命周期在函数内。函数退出,局部变量就被销毁。全局变量在程序的整个生命周期都存在。只有程序退出时,全局变量才退出。
运行结果为1,不是2,因为modify函数内的num实际上是局部变量,无法对全局变量num进行更改。
由于全局变量在整个程序范围内都可被访问,因此函数内部可以使用全局变量。如果要修改全局变量,则需要借助global关键字。在modify函数内部添加global num,意味着所使用的num变量是全局变量。
运行结果为2,因为通过global的声明,modify函数成功地将全局变量num修改为2。
在modify函数中继续构建modify1函数,并通过modify1函数修改modify函数的变量。
运行结果为1,modify1函数想要修改上一层函数中的变量,需要借助nonlocal关键字。
运行后,得到预期的结果2。
在Python中,程序的变量并不是在任何位置都可以随意访问的,访问权限决定于这个变量在哪里赋值。变量的作用域决定了哪一部分程序可以访问哪个特定的变量。变量的作用域有4个:
· L(Local),局部作用域;
· E(Enclosing),闭包函数外的函数作用域;
· G(Global),全局作用域;
· B(Built-in),内建作用域。
Python按照LEGB的原则搜索变量,即优先级为L>E>G>B,也就是,在局部找不到,便会去局部外的局部找(如闭包),再找不到,就去全局找,若还是找不到,则去内建中找。