闭包

 

局部变量在函数执行完成后就被销毁了。那么如果在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',)

 

posted @ 2020-04-14 14:21  坚强的小蚂蚁  阅读(123)  评论(0编辑  收藏  举报