python 闭包

在python中我们可以在一个函数中再定义一个函数,而内部的函数可以使用外部的局部变量。如下面的代码:
01  def test():
02     a=1
03     def test1():
04         print a
05     a=2
06     test1()
07     a=3
08     test1()
09  
10  test()

输出结果是

2

3

这是一个很方便的特性,但是需要注意的是,在内部的函数中无法修改外部的局部变量。

例如下面的代码,就会报错:
01  def test():
02     a=1
03     def test1():
04         a+=2
05         print a
06     a=2
07     test1()
08     a=3
09     test1()
10  
11  test()

UnboundLocalError: local variable ‘a’ referenced before assignment

在python的FAQs中提到了这件事,如果一个变量在函数中被赋值,那么就被视为局部变量,也就是test1里面的a此时被认为是test1自己的局部变量,而我们没有给a赋值就使用了a,于是出现上面的异常信息。这也就是我前面说“无法修改”的原因,并不是不允许修改,而是无法使用到这个外部的变量(test的a是外部变量,test1中的a被当成了局部变量,在test1中我们看不见test中的a)。

在python 3.0之后,我们可以通过给一个变量加nonlocal标识符来告诉解释器,不要把这个变量当成函数内部的局部变量,从而可以修改外部变量。这也更证明了前面的无法修改的观点。3.0代码如下:
 
01  def test():
02     a=1
03     def test1():
04         nonlocal a
05         a+=2
06         print(a)
07     a=2
08     test1()
09     a=3
10     test1()
11  
12  test()


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值