閉包的三個條件:
1、函數(外函數)中定義了內函數;2、內函數使用了外函數的非全局變量;3、外函數最終返回的是內函數的引用。
簡單閉包事例:
#outerfunc為外函數 def outerfunc(x): y = 10 #x,y都是外函數的非全局變量 #innerfunc是內函數 def innerfunc(): #內函數使用了外函數的非全局變量 return x * y #外函數最終返回的是內函數的引用 return innerfunc
然后執行如下代碼:
func = outerfunc(2)
func()
輸出 20
因為外函數最終返回的是內函數的引用,所以變量func為內函數innerfunc的引用,
func(),變量后面加了括號,則是執行內函數,所以最終結果為20。
再看下面的例子:
def outerfunc(x): def innerfunc(y): return x * y return innerfunc func = outerfunc(2) print(func(3)) print(func(4))
輸出結果分別為6和8
print(func(3)):因為func是內函數的引用,參數2是外函數的變量,被內函數使用,而func(3)執行的是內函數,3是傳給內函數的參數,所以結果為6
print(func(4))也是同樣的道理。
上面的代碼改下,如下:
def outerfunc(x): def innerfunc(y): return x return innerfunc func = outerfunc(2) print(func(3)) print(func(30))
上面輸出都是2
因為內函數只用到了外函數的變量
以上是本人的理解,有誤望諒解,歡迎指正。