内部函数可以看做一个闭包。闭包是一个可以由另一个函数动态生成的函数,并且可以改变和存储函数外创建的变量的值。
    下面的例子可以看出闭包的特点:
     * inner2()直接使用外部的saying参数,而不是通过另外一个参数获取;
     * knights2()返回值为inner2函数,而不是调用它。

def knights2(saying):
  def inner2():
    return "We are the knights who say: '%s'" % saying
  return inner2

      inner2()函数可以得到saying参数的值并且记录下来。 return inner2这一行返回的是inner2函数的复制(没有直接调用)。所以它就是一个闭包:一个被动态创建的可以记录外部变量的函数。

#用不同的参数调用knighets2()两次:
>>> a = knights2('Duck')
>>> b = knights2('Hasenpfeffer')
#那么a和b会是什么类型?
>>> type(a)
<class 'function'>
>>> type(b)
<class 'function'>
#它们是函数,同时也是闭包:
>>> a
<function knights2.<locals>.inner2 at 0x10193e158>
>>> b
<function knights.<locals>.inner2 at 0x10193e1e0>
#如果调用它们,会记录被knights2函数创建时的外部变量saying:
>>> a()
"We are the knights who say: 'Duck'"
>>> b()
"We are the knights who say: 'Hasenpfeffer'"

摘抄自《Python语言及其应用》4.7.9闭包