簡體   English   中英

什么是封閉功能?

[英]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_functiony有什么不同呢?

封閉函數是嵌套在函數中的函數。 我們通常使用它來獲得更好的封裝。 這是封閉功能對其他功能不可見。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM