如果一个函数里面定义了另一个函数,这样的函数叫nested function
, nested function
可以访问它的封闭区域内的变量。比如
def add_function(value):
def add_value(x):
return x + value
return add_value
add3 = add_function(3)
print add3(10) # output is 13
now if we delete the function add_function
. we can still run add3
function and 3
will be remembered.
这种数据3
和code捆绑在一起的方法叫闭包closure
什么时候会出现closure
?
以下三个条件必须满足:
1. 有一个nested function
(function inside a function)
2. nested function
会涉及一个定义在封闭函数内部的值
3. 最终要返回nested function
什么时候使用closure
closure
避免了使用全局变量。如果一个类(class
)只有很少的methods
的时候,使用closure
会更方便简洁。比如上面的例子,我们可以很快的定义不同的加法函数
add5 = add_function(5)
add10 = add_function(10)
print add5(10)
print add10(10)
所有的python函数都有一个__closure__
属性。
add_function.__closure__
add5.__closure__ # Out[18]: (<cell at 0x00000000040A09A8: int object at 0x0000000001D58758>,)
add5.__closure__[0].cell_contents
Figure 1. tab1: show the plot