Python 閉包詳解

2021-10-21 02:17:28 字數 1691 閱讀 6323

一、python變數作用域問題

time = 0  #-----全域性變數

def insert_time(min):

time = time + min #----區域性變數

return time

print(insert_time(2))

print(insert_time(10))

unboundlocalerror: local variable 'time' referenced before assignment

time為全域性變數,函式中使用了該同名變數,且更改了該變數的值,導致**在執行時,分不清time是全域性變數還是區域性變數,認為全域性變數的話,函式體內部對全域性變數進行了更改,認為是區域性變數,函式體內部又沒有對該變數進行定義就直接引用了

針對這樣的問題,引入全域性變數global和區域性變數nonlocal

time = 0  #-----全域性變數

def insert_time(min):

global time

time = time + min #----區域性變數

return time

print(insert_time(2))

print(insert_time(10))

print(time)

》2 12

但是,全域性變數global的使用存在弊端:全域性變數降低了函式或模組之間的通用性,不同的函式或模組都要依賴於全域性變數。同樣,全域性變數降低了**的可讀性,閱讀者可能並不知道呼叫的某個變數是全域性變數。

time = 0  #-----全域性變數

def insert_time(min):

nonlocal time

time = time + min #----區域性變數

return time

print(insert_time(2))

print(insert_time(10))

print(time)

報錯:syntaxerror: no binding for nonlocal 'time' found

函式中使用nonlocal定義time為區域性變數,nonlocal關鍵字是能作用域區域性變數,當使用nonlocal宣告變數 time 時,就會往上最近一層區域性作用域尋找區域性變數 time ,結果沒找著,上一層的time是全域性變數,報錯。

完善的方法:閉包--內部函式的區域性作用域中可以訪問外部函式區域性作用域中變數的行為,避免使用全域性變數

time = 0  #-----全域性變數

def study_time(time):

def insert_time(min):

nonlocal time

time = time + min #----區域性變數

return time

return insert_time

f = study_time(time)

print(f(2))

print(time)

print(f(10))

print(time)

》2  0  12  0

執行過程解析:

參考:

python 閉包 python 閉包

閉包 因為python中函式也可以當作物件,所以如果出現當我們返回乙個函式,而該函式含有外部變數的時候就形成了閉包。閉包的特點 是個巢狀函式 可以獲得非區域性的變數 將函式當作物件返回 看乙個例子會更易理解 def make printer msg msg hi there def printer ...

python閉包詳解 例項演示

python閉包詳解 例項演示 閉包 這個詞語相信大多數學過程式設計的同學並不陌生,但是有時候理解起來還是有一定難度。先看定義 閉包是由函式和與其相關的引用環境組合而成的實體。比如參考資源中就有這樣的的定義 在實現深約束時,需要建立乙個能顯式表示引用環境的東西,並將它與相關的子程式 在一起,這樣 起...

詳解Python中的閉包

定義 python中閉包的定義是 在乙個內部函式裡,對在外部作用域 非全域性作用域 的變數進行引用,則內部函式就被認為是閉包 closure 我們來結合 看一下閉包的概念 在函式addx 內部存在函式addy 因此,addy 就是內部函式。下面對函式addx 呼叫 我們可以發現addx 8 的型別是...