请解释python中的闭包

闭包(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属性中。

cell对象结构

你可能感兴趣的:(请解释python中的闭包)