局部变量在函数执行完成后就被销毁了。那么如果在line函数中使用了line_conf的变量,当line_conf函数执行完成后,在全局环境中的line函数还能使用line_conf中的变量吗?
def line_conf(): b = 15 def line(x): return 2*x + b return line b = 5 my_line = line_conf() print(my_line(5))
在上面的代码中,line函数使用了父函数中声明的变量b, 此时变量b为line的环境变量
当line函数作为line_conf函数的返回值时( return line), 变量b的取值已经和line函数绑定在一起,此时父函数line_conf已经和变量b没关系了,变量b即使再变化,也不会影响到line函数的计算结果
这种情况下,我们就说line函数和它的环境变量b构成了一个闭包,闭包时一个独立的运行环境,不受外部环境的影响。 上面的代码输出结果时25, 而不是15
查看闭包中自由变量b的值
>>> myline.__closure__[0].cell_contents 15
查看myline对象实例中的自由变量,局部变量
>>> myline.__code__.co_freevars ('b',) >>> myline.__code__.co_varnames ('x',)