什么是封闭功能?

dan*_*ion 3 python

根据python教程,函数在查找全局函数之前在封闭函数的符号表中查找变量名:

函数的执行引入了用于函数局部变量的新符号表.更确切地说,函数中的所有变量赋值都将值存储在本地符号表中; 而变量引用首先在本地符号表中查找,然后在封闭函数的本地符号表中查找,然后在全局符号表中查找,最后在内置名称表中查找.因此,全局变量不能直接在函数内赋值(除非在全局语句中命名),尽管可以引用它们.

"封闭功能"究竟是什么意思,何时使用?

我看到以下代码在调用时打印10

def parent_function():
    y=10
    def child_function():
        print y
    child_function()
Run Code Online (Sandbox Code Playgroud)

但是,单独调用child_function()会产生错误.是否经常使用封闭功能?

mal*_*c47 7

封闭函数的概念是理解闭包概念的关键.因为python没有全功能的lambda(它们只允许表达式而不是语句),所以将嵌套函数传递给其他函数是一个常见的用例:

def receiving_function(f):
    f()

def parent_function():
    y = 10

    def child_function():
        print(y)

    receiving_function(child_function)
Run Code Online (Sandbox Code Playgroud)

10像以前一样打印.这是闭包的常见实例,其中封闭函数将其变量"移交"到封闭函数中.在上面的示例中,此函数receiving_function与非局部变量一起传递y.

  • 这是一个很好的,虽然是单独的问题.例如,考虑一下`y = 10`是不是一个简单的赋值,但实际上是一个非常昂贵的`child_function`需要的操作.还要考虑一下,你有很多,而不是一个`child_function`.不必将这个非常昂贵的计算放在每个单独的函数中,并在每个函数调用上计算它,你可以将它包装在一个闭包中,并为这个假设的`child_functions`集预先计算.查看[this](http://stackoverflow.com/questions/1305570/closures-why-are-they-so-useful)获取一些有用的答案. (2认同)