yorknong 发表于 2017-5-6 11:49:42

零基础学python-16.7 nonlocal介绍

  这一章节我们来讨论一些nonlocal
  1.nonlocal简介
  nonlocal与global相似,但是它只是作用于嵌套作用域,而且只是作用在函数里面

>>> def test():
x=1
print("test:"+str(x))
def test2():
nonlocal x
x=3
print("test2:"+str(x))
class a:
nonlocal x
x=5
print("a:"+str(x))
def a1():
nonlocal x
x=7
print("a.a1:"+str(x))
test2()
a.a1()
print("test:"+str(x))

>>> test()
test:1
a:5
test2:3
a.a1:7
test:7


从上面的代码可以得出前面的结论,大家也许会注意到,test里面有个class,而且它里面的nonlocal x起作用了,是不是相违背?  不是,因为它的最外层是def
  我们给一个更加直接的代码:

>>> def test():
x=1
print("test:"+str(x))
#def test2():
#nonlocal x
#x=3
#print("test2:"+str(x))
class a:
nonlocal x
x=5
print("a:"+str(x))
def a1():
nonlocal x
x=7
print("a.a1:"+str(x))
#test2()
a()
print("test:"+str(x))

>>> test()
test:1
a:5
test:5
>>>


我们注释了一部分代码,而且不知道a里面的a1,这个时候我们看见,nonlocal也是起作用的  

  但是有一点需要注意的地方:(也是global与nonlocal的区别)
  global可以从嵌套的作用域开始执行,但是nonlocal所声明的变量必须已经存在,不然会报错

>>> def test():
global x

>>> def test():
nonlocal x
SyntaxError: no binding for nonlocal 'x' found
>>>


2.应用  nonlocal主要用于修改外层函数的变量
  看下面代码:

>>> def test():
x=1
print("test:"+str(x))
def test2():
#nonlocal x
x=3
print("test2:"+str(x))
test2()
return x
>>> test()
test:1
test2:3
1
>>>


如果没使用nonlocal,x是不会改变的
>>> def test():
x=1
print("test:"+str(x))
def test2():
nonlocal x
x=3
print("test2:"+str(x))
test2()
return x
>>> test()
test:1
test2:3
3
  


但是使用了nonlocal声明x,x在test2执行后,已经改变了状态  

  总结:这一章节主要讲述了nonlocal是什么,还讲述了nonlocal的简单应用
  


这一章节就说到这里,谢谢大家


------------------------------------------------------------------

点击跳转零基础学python-目录



         
版权声明:本文为博主原创文章,未经博主允许不得转载。
页: [1]
查看完整版本: 零基础学python-16.7 nonlocal介绍