函数create_y与变量a,b构成闭包。在创建闭包的时候,我们通过test的参数a,b说明了这两个变量的取值,这样,我们就确定了函数的最终形式(y = x + 2和y = 2x + 4)。我们只需要变换参数a,b,就可以获得不同的直线表达函数。由此,我们可以看到,闭包也具有提高代码可复用性的作用。
如果没有闭包,我们需要每次创建直线函数的时候同时说明a,b,x。这样,我们就需要更多的参数传递,也减少了代码的可移植性。
关于闭包,维基百科的定义如下:
在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。
百度百科:
闭包是可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。在 Scala、Scheme、Common Lisp、Smalltalk、Groovy、JavaScript、Ruby、 Python和Lua,objective c 等语言中都能找到对闭包不同程度的支持。
在编程领域我们可以通俗的说:子函数可以使用父函数中的局部变量,这种行为就叫做闭包!
- 修改闭包中的数据# python3中:
x = 100
def test1():
x = 101
def test2():
nonlocal x
print("--1--x: %s" % x)
x = 102
print("--2--x: %s" % x)
return test2
test1()() 像在函数中修改全局变量一样,在python3中修改闭包中的数据需要使用nonlocal,就像上面那么:nonlocal x
python2中:
def test1():
x = 101
temp_list = [x]
def test2():
print("--1--x: %s" % temp_list[0])
temp_list[0] = 102
print("--2--x: %s" % temp_list[0])
return test2
test1()() 由于python2没有像python3中的nonlocal,要在python2中修改闭包中的数据,只能在一个list中保存要修改的变量,直接对该列表中对应的数据进行修改就能完成伪修改。