什么是封闭功能?

时间:2012-02-17 04:08:41

标签: python

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

  

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

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

我看到以下代码在调用

时打印10
def parent_function():
    y=10
    def child_function():
        print y
    child_function()

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

3 个答案:

答案 0 :(得分:7)

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

def receiving_function(f):
    f()

def parent_function():
    y=10
    def child_function():
        print y
    receiving_function(child_function)

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

答案 1 :(得分:2)

您无法单独调用child_function的原因是它是在parent_function内定义的。所有python变量声明都使用块作用域,声明函数也没有区别。

请考虑以下示例。

>>> def parent_function():
...    y=10
...    def child_function():
...        print y
...    child_function()

>>> print y
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
NameError: name 'y' is not defined

y之外无法访问变量parent_function。为什么child_functiony会有任何不同?

答案 2 :(得分:2)

封闭函数是嵌套在函数中的函数。 我们通常使用它来获得更好的封装。 这是封闭的功能对于其他功能是不可见的。