python 闭包

作者: admin 分类: python 发布时间: 2013-04-21 21:55 ė 6 没有评论

在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()

本文出自 小Q,转载时请注明出处及相应链接。

本文永久链接: http://www.linuxqq.com/archives/951.html

0
更多
Ɣ回顶部