当函数可以从完成其执行的封闭范围访问局部变量时,就会发生关闭。
def make_printer(msg): def printer(): print msg return printerprinter = make_printer('Foo!')printer()当
make_printer被调用时,一个新的帧放在堆栈上的编译代码的
printer功能作为一个恒定的值和
msg作为本地。然后,它创建并返回函数。由于函数
printer引用了
msg变量,因此在
make_printer函数返回后,该变量将保持活动状态。
因此,如果你的嵌套函数没有
- 访问封闭范围本地的变量,
- 当它们在该范围之外执行时,
那么它们不是闭包。
这是一个不是闭包的嵌套函数的示例。
def make_printer(msg): def printer(msg=msg): print msg return printerprinter = make_printer("Foo!")printer() #Output: Foo!在这里,我们将值绑定到参数的默认值。printer创建函数时会发生这种情况,因此返回 后无需保留对msgexternal 值的引用。在这种情况下只是函数的普通局部变量
。printermake_printermsgprinter



