Python函数变量作用域及其搜索范围
同名变量他们的代表的含义可能不同,因为他们有不同的作用域,在不同作用域内他们代表的含义不同比如
由此可见虽然变量a是同名的但是他们在不同位置所代表的含义并不同,这就是变量在不同位置有着不同的作用域。
1.变量的搜索顺序
当存在嵌套函数即函数套函数时,可能存在变量同名的情况,这些变量虽然名字相同但是他们的含义却有可能不同,那么靠什么区分这些呢这就有了作用域,也就是说不同作用域的同名变量含义不同。在python中我们大多通过LEGB的规则去对他们加以区分。
LEGB
L:local 本地 局部变量
E:enclosing 嵌套
G:global 全局变量
B:built-in 内置的
我们按照LEGB的顺序依次查询,比如我们先查询局部变量也就是一个函数中的变量(L)如果没有我们就去寻找他的上层函数的变量(E)如果还是没有那就去全局变量中去寻找(G)还没有就去Python本身内置的东西去找,这种情况下大多是找Python的内置函数(B)
2.全局变量,局部变量的修改
当你在内部函数中修改全局变量时你需要加关键字global声明他是全局变量才行。
我们可以看到当在内部函数中修改全局变量时,修改之后只在他的内部有效,在外部输出全局变量的值是不变的也就是说在局部修改全局变量,全局变量只在局部发生改变在全局是不变的。list也是全局变量他在局部修改为什么不用加global呢因为list是可变的,也就是说当我们修改不可变的局部变量时,必须加global。func的局部变量被我改成了a1也就是说当我们在局部修改全局变量时全局变量尽量不要与局部变量同名否则会发生错误。
当修改不可变的外部函数的局部变量时要在该变量面前添加nonlocal
无论是global还是nonlocal都需要在内部函数开头添加,否则会出现错误
global同理