[英]What are enclosing functions?
根據python教程 ,函數在查找全局函數之前在封閉函數的符號表中查找變量名:
函數的執行引入了用於函數局部變量的新符號表。 更確切地說,函數中的所有變量賦值都將值存儲在本地符號表中; 而變量引用首先在本地符號表中查找,然后在封閉函數的本地符號表中查找,然后在全局符號表中查找,最后在內置名稱表中查找。 因此,全局變量不能直接在函數內賦值(除非在全局語句中命名),盡管可以引用它們。
“封閉功能”究竟是什么意思,何時使用?
我看到以下代碼在調用時打印10
def parent_function():
y=10
def child_function():
print y
child_function()
但是,單獨調用child_function()會產生錯誤。 是否經常使用封閉功能?
封閉函數的概念是理解閉包概念的關鍵。 因為python沒有全功能的lambdas(它們只允許表達式而不是語句),所以將嵌套函數傳遞給其他函數是一個常見的用例:
def receiving_function(f):
f()
def parent_function():
y = 10
def child_function():
print(y)
receiving_function(child_function)
將像以前一樣打印10
。 這是閉包的常見實例,其中封閉函數將其變量“移交”到封閉函數中。 在上面的示例中,此函數與非局部變量y
一起傳遞給receiving_function
。
你child_function
調用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
之外parent_function
。 為什么你會期望child_function
與y
有什么不同呢?
封閉函數是嵌套在函數中的函數。 我們通常使用它來獲得更好的封裝。 這是封閉功能對其他功能不可見。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.