通俗地講就是別人家有某個東西,你想拿到但是因為許可權不夠(不打死你才怪),但是你可以跟家裡的孩子套近乎,通過他拿到!這個家就是區域性作用域,外部無法訪問內部變數,孩子是從家裡返回物件,對家裡的東西有訪問許可權,借助返回物件間接訪問內部變數!
def outer(): #------別人家
x = 10 #別人家裡的東西
def inner(): #內部函式------別人家的小孩
print(x) #外部函式的乙個變數
return inner #------返回小孩
f = outer() #到別人家 「套近乎」別人的小孩,套出(返回)小孩f
f() #f小孩執行
# 呼叫inner()函式的方法
1、法一
outer()()
2、法二
f = outer()
f()
閉包的概念
在一些語言中,在函式中可以(巢狀)定義另乙個函式時,如果內部的函式引用了外部的函式的變數,則可能產生閉包。閉包可以用來在乙個函式與一組「私有」變數之間建立關聯關係。在給定函式被多次呼叫的過程中,這些私有變數能夠保持其永續性。—— 維基百科
用比較容易懂的人話說,就是當某個函式被當成物件返回時,夾帶了外部變數,就形成了乙個閉包。看例子。
何時使用閉包
其實閉包在python中很常見,只不過你沒特別注意這就是乙個閉包。比如python中的裝飾器decorator,假如你需要寫乙個帶引數的裝飾器,那麼一般都會生成閉包。
我個人認為,閉包存在的意義就是它夾帶了外部變數(私貨),如果它不夾帶私貨,它和普通的函式就沒有任何區別。同乙個的函式夾帶了不同的私貨,就實現了不同的功能。其實你也可以這麼理解,閉包和面向介面程式設計的概念很像,可以把閉包理解成輕量級的介面封裝。
如果內部修改外部變數需要nonlocal,global
def f1():
print("in f1..")
num=111
def f2():
nonlocal num
num=222
print(num)
f2()
print(num)
f1()
原文:
python 閉包 Python中的閉包
一 什麼是閉包 在談之前,我們先來說說作用域,變數的作用域無非就兩種 全域性變數和區域性變數。函式內部可以直接讀取全域性變數,但是在函式外部無法讀取函式內部的區域性變數。出於種種原因,我們有時候需要獲取到函式內部的區域性變數。但是,正常情況下,這是辦不到的!只有通過變通的方法才能實現。於是就引入了閉...
python中閉包 python中的閉包
一 定義 如果在乙個內部函式裡,對在外部作用域 但不是在全域性作用域 的變數進行引用,那麼內部函式就被認為是閉包 closure 這個定義是相對直白的,閉包有三個條件 1.函式巢狀 2,內部函式呼叫外部函式的變數 3.返回內部函式 defa a defb b s a breturnsreturnb ...
python 閉包 python 閉包
閉包 因為python中函式也可以當作物件,所以如果出現當我們返回乙個函式,而該函式含有外部變數的時候就形成了閉包。閉包的特點 是個巢狀函式 可以獲得非區域性的變數 將函式當作物件返回 看乙個例子會更易理解 def make printer msg msg hi there def printer ...