闭包(closure)的概念
闭包是指延伸了作用域的函数,此作用域中的变量声明周期和函数一样,即使离开创建的作用域也不外。
手写一个闭包
def print_msg():
msg = "hello world"
def printer():
print(msg)
return printer
p_msg = print_msg()
p_msg()
请解释一下,你写的程序
在print_msg函数内部定义了一个msg变量和printer函数,并在printer函数内部使用了msg变量,最终将printer函数对象作为print_msg函数的返回结果。
当我们调用print_msg函数时,会得到一个p_msg对象,它就是printer函数对象。但是在printer函数的内部并不存在局部变量msg,这是msg变量是从print_msg函数中引入的。
在调用p_msg函数对象时,其实我们执行的是带有msg变量的printer函数。这样的情况下,p_msg被称为是闭包。
python函数对象有一个closure属性,如果如果这是一个闭包,obj.closure会返回一个cell对象,这个cell对象有一个cell_contents属性,可以在cell_contents中看到自由变量的值。
这也解释了为什么变量脱离了作用域后,依然还可以在函数中使用。原理就是引用变量的值会被存储到cell对象的cell_contents属性中。
网友评论