python中全局变量和局部变量,nonlocal与global

其实关于全局变量与局部变量已经有很多文章讲过了
简单来说就是
在函数体内部定义的变量,是局部变量,所处的是内部作用域(内部定义空间)
在函数体外部定义的变量,是全局变量,所处的是外部作用域(外部命名空间)

函数体内一个变量的查找顺序(局部变量的查找顺序)
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一起使用,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值