根据the python tutorial,函数在查找全局函数之前在封闭函数的符号表中查找变量名:
函数的执行引入了一个用于函数局部变量的新符号表。更确切地说,函数中的所有变量赋值都将值存储在本地符号表中;而变量引用首先在本地符号表中查找,然后在封闭函数的本地符号表中查找,然后在全局符号表中查找,最后在内置名称表中查找。因此,全局变量不能直接在函数内赋值(除非在全局语句中命名),尽管可以引用它们。
“封闭功能”究竟是什么意思,何时使用?
我看到以下代码在调用
时打印10def parent_function():
y=10
def child_function():
print y
child_function()
但是,单独调用child_function()会产生错误。是否经常使用封闭功能?
答案 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_function
与y
会有任何不同?
答案 2 :(得分:2)
封闭函数是嵌套在函数中的函数。 我们通常使用它来获得更好的封装。 这是封闭的功能对于其他功能是不可见的。