Python3.7之閉包

Python3.7之閉包

1、條件

1 在一個外函數中定義了一個內函數。python

2 內函數裏運用了外函數的臨時變量。閉包

3 而且外函數的返回值是內函數的引用。函數

通常狀況下,若是一個函數結束,函數的內部全部東西都會釋放掉,還給內存,局部變量都會消失。可是閉包是一種特殊狀況,若是外函數在結束的時候發現有本身的臨時變量未來會在內部函數中用到,就把這個臨時變量綁定給了內部函數,而後本身再結束。code

def outer():
    name = 'alex'

    def inner():
        print("inner", name)
    return inner


f = outer()
print(f)
f()

1 外函數返回了內函數的引用:內存

在外函數outer中 最後return inner,在調用外函數 f = outer() 的時候,outer返回了inner,inner是一個函數的引用,這個引用被存入了f中。因此接下來再進行使用f() 的時候,至關於使用了inner函數。class

一個函數,若是函數名後緊跟一對括號,說明如今就要調用這個函數,若是不跟括號,只是一個函數的名字,裏面存了函數所在位置的引用。變量

2 外函數把臨時變量綁給內函數:引用

外部函數發現,本身的臨時變量會在未來的內部函數中用到,本身在結束的時候,返回內函數的同時,會把外函數的臨時變量和內函數綁定在一塊兒。因此外函數已經結束了,調用內函數的時候仍然可以使用外函數的臨時變量。co

2、內函數修改外函數局部變量

在python3中,能夠用nonlocal 關鍵字聲明 一個變量, 表示這個變量不是局部變量空間的變量,須要向上一層變量空間找這個變量。return

def outer():
    name = 'alex'

    def inner():
        nonlocal name
        name = name+' python'
        print("inner", name)
    return inner


f = outer()
print(f)
f()

'''
inner alex python
'''

注:使用閉包的過程當中,一旦外函數被調用一次返回了內函數的引用,雖然每次調用內函數,是開啓一個函數執行事後消亡,可是閉包變量實際上只有一份,每次開啓內函數都在使用同一份閉包變量。

相關文章
相關標籤/搜索