1、变量做用域的含义python
变量的做用域说白了就是变量的值从哪里获取,或者说变量取值的地方函数
咱们在写代码过程当中会用到不少变量,这些变量会出如今各类代码块中,有的出如今函数块里,有的在函数块外,例如:spa
def n2():
a = 1
b = 2
def n1():
b = 3
print(b)
print(a)
n1()
n2()
结果:
3
1
在这个例子中,对于变量a,b的值,是应该先识别函数中的仍是先识别函数外的呢,其实python内部在识别变量的值得时候是有顺序的,不是胡乱读取的,python内部对于获取变量的值是规定了一个顺序的。作用域
2、变量定义域顺序变量
LEGB原则搜索
当你在代码里声明一个变量后,python会在LEGB四个做用域里搜索变量的值,它的搜索是有顺序的,第一步如今L也就是当前最里层局部做用域内找,若是没找到,第二步会跑到包含当前层的上一层做用域E里找,还没找到的话,第三部会去模块级的里面G里找,最后是去python里的固定模块里找。co
3、在不一样做用域修改变量的值
问题1.,既然对于变量的值的搜索有顺序,若是当前在全局里已经有变量a的值,我在局部域里想修改a的值,怎么修改呢?
问题2. 若是变量是在上一层的函数里有值,我想在当前层函数内修改,又如何操做呢?
问题1的解答:对于这种状况须要用到global,在从新给变量a赋值时,要先声明变量global a,
a = 1
def n():
global a
print(a)
a = 123
print(a)
n()
结果:
1
123
问题2的解答:对于这种状况须要用到nonlocal,在从新给变量a赋值时,要先声明变量nonlocal a
def n1():
a = 1
def n2():
nonlocal a
a = 2
print(a)
n2()
print(a)
n1()结果:224、哪些状况适用变量的做用域对于模块,类,函数里出现的变量就要注意了,它们会引入新的做用域,在这里若是内部做用域声明了变量,那么就用内部变量的值,内部若是没有声明,就会使用外部做用域的值