Python2 中的闭包比较怪异,和javascript中的闭包不大一样,这里说明一下。
不少内容引自http://www.cnblogs.com/vamei/archive/2012/12/15/2772451.html这篇文章,加以说明。
def line_conf():
b = 15
def line(x):
return 2*x+b
return line # return a function object
b = 5
my_line = line_conf()
print(my_line(5))
这段代码可以正常运行,结果为25
但是下面这个就不行
def line_conf():
b = 15
def line(x):
if(b>10):
b=50;
return 2 * x + b
return line # return a function object
my_line = line_conf()
print(my_line(5))
就会提示如下错误:
UnboundLocalError: local variable 'b' referenced before assignment
这是因为在line函数中对b进行了赋值,python就认为这个是一个局部变量(如果想修改全局变量,就必须进行global声明)。
如果还想这个方法可以使用,就必须将b声明为全局变量。如下:
b=10
def line_conf():
global b;
b = 15
def line(x):
global b;
if(b>10):
b=50;
return 2 * x + b
return line # return a function object
my_line = line_conf()
print(my_line(5))
当然如果你不想进行全局变量声明,就把b放进list中,方式很多,但是就是不能直接出现对外部函数局部变量直接赋值的语句。