如果試圖在一個(gè)內(nèi)部函數(shù)里對(duì)外部作用域(不包括外部函數(shù)的外部作用域)的變量進(jìn)行引用,內(nèi)部函數(shù)就會(huì)被認(rèn)為是閉包。

閉包實(shí)例
對(duì)于func2函數(shù)來(lái)說(shuō),對(duì)在func1函數(shù)的整個(gè)作用域(func2函數(shù)的非全局作用域的外部作用)的變量x進(jìn)行引用,自此就可以說(shuō)func2函數(shù)就是所謂的閉包。由于閉包本身是基于內(nèi)部函數(shù)的概念,所以不能在外部函數(shù)的外部作用域?qū)Ρ徊缓M(jìn)行調(diào)用。

既然是基于內(nèi)部函數(shù)這一概念而來(lái),自然對(duì)于內(nèi)部函數(shù)來(lái)說(shuō)對(duì)引用外部函數(shù)作用域內(nèi)的變量進(jìn)行修改,將會(huì)啟動(dòng)解釋器的屏蔽機(jī)制。x*=x的左值此時(shí)是內(nèi)部函數(shù)作用域里的變量,此時(shí)試圖將沒(méi)有定義的數(shù)據(jù)進(jìn)行平方操作,因此報(bào)錯(cuò)。
解決方法1:

應(yīng)用容器類(lèi)型(list,tuple之類(lèi)的)存放外部函數(shù)作用域的變量從而不會(huì)被屏蔽機(jī)制屏蔽掉,因?yàn)槿萜黝?lèi)型不是存放在棧里面。
解決方法2(python3之后的解決辦法):

nonlocal關(guān)鍵字