其实关于全局变量与局部变量已经有很多文章讲过了
简单来说就是
在函数体内部定义的变量,是局部变量,所处的是内部作用域(内部定义空间)
在函数体外部定义的变量,是全局变量,所处的是外部作用域(外部命名空间)
函数体内一个变量的查找顺序(局部变量的查找顺序)
1.当前函数内部作用域中查找有没有定义这个变量
2.会去全局作用域中查找.如果有同名的变量,那么会直接获取
3.会去系统模块中查找,如果系统模块中找不到,那么会抛出NameError异常
总结下面几种情况
1.全局有定义,局部有定义,全局使用全局的,局部使用局部的
2.全局有定义,局部有定义(定义成功前提是使用全局的定义),局部定义失败报错
3.全局有定义,局部没有定义,局部不可以修改
4.全局有定义,局部没有定义,局部可以调用全局(前提函数调用要在全局定义后)
5.局部有定义,全局没有,全局无法调用
6.局部有定义,全局有定义,全局不能修改局部变量
7.使用global方法,全部定义为全局变量,无论后续定义的在全局还是局部,只要定义名一样都为全局
主要想讲下nonlocal与global
global可能比较常见,简单来说就是将一个局部变量变成全局变量
看完代码就会发现这对于变量是非常危险的,可以随意更改的变量是不够"安全"的
def add(a,b):
c = a + b
return c
c=4
print(c)
add(5,7)
print(c)
>>>>4
>>>>4
def add(a,b):
global c
c = a + b
return c
c=4
print(c)
add(5,7)
print(c)
>>>>4
>>>>12
还要注意的是的global是先声明在定义!
如下代码会直接报错SyntaxError: name ‘c’ is assigned to before global declaration
def add(a,b):
c = a + b
global c
return c
剩下的就是今天的主角了nonlocal
nonlocal是在Python3.2之后引入的一个函数叫非局部声明变量,一句话就是它是用在封装函数中的。
指代的已有标识符是最近外面函数的已声明变量,但是需要注意的是他是不包括全局变量的。
总结来说1.nonlocal声明的变量只对局部起作用,离开封装函数,那么该变量就无效。
2.非局部声明不像全局声明,我们必须在封装函数前面事先声明该变量
3.非局部声明不能与局部范围的声明冲突
count = 1
def a():
count = 'a函数里面' #如果不事先声明,那么函数b中的nonlocal就会报错
def b():
nonlocal count
print(count)
count = 2
b()
print(count)
a()
print(count)
结果如下:
>>>>a函数里面
>>>>2
>>>>1
这样就很好理解了,nonlocal 只能用在函数的函数体里面,且只能读到上一级函数声明的变量
那他可以和global 组合使用吗?
count = 1
def a():
global count
count = 'a函数里面'
def b():
nonlocal count
print(count)
count = 2
b()
print(count)
a()
print(count)
这里会直接报错
报错内容为SyntaxError: no binding for nonlocal ‘count’ found
就是nonlocal 找不到可以声明的变量,简单来说就是不能声明全局变量,不能和global一起使用,