更新時(shí)間:2022年10月21日15時(shí)05分 來(lái)源:傳智教育 瀏覽次數(shù):
若在函數(shù)作用域中需要修改全局作用域或外層嵌套作用域中的變量,則需要使用global和nonlocal關(guān)鍵字。接下來(lái),分別對(duì)關(guān)鍵字global和nonlocal的作用進(jìn)行介紹。
global關(guān)鍵字用于在函數(shù)作用域中修改全局變量。假設(shè)現(xiàn)在有一個(gè)test函數(shù),其外部定義了一個(gè)全局變量a,其內(nèi)部對(duì)全局變量a進(jìn)行重新賦值,示例代碼如下:
a = 100 def test(): a += 100 print(a) test() Traceback (most recent call last): File "<stdin>", line1, in <module> File "<stdin>", line2, in test UnboundLocalError:local variable 'a' referenced before assignment
上述程序報(bào)錯(cuò),提示“在賦值前引用了局部變量a”。但是,前面我們明明是可以在函數(shù)中訪問(wèn)全局變量的呀?而這里為什么會(huì)出錯(cuò)呢?
這就是Python與其他語(yǔ)言的不同之處了。在Python中,如果在函數(shù)內(nèi)部對(duì)全局變量a進(jìn)行修改,Python會(huì)把變量a當(dāng)作是局部變量,而在進(jìn)行“a+=100”之前,我們是沒(méi)有聲明局部變量a的,因此,程序會(huì)出現(xiàn)上述錯(cuò)誤提示。
要想在函數(shù)內(nèi)修改全局變量,我們可以在函數(shù)內(nèi)使用global關(guān)鍵字進(jìn)行聲明,下面,我們對(duì)程序進(jìn)行修改,示例代碼如下:
a = 100 def test(): global a a += 100 print(a) test() 200
這下,程序不但沒(méi)有報(bào)錯(cuò),而且成功對(duì)全局變量a進(jìn)行了修改。
使用nonlocal關(guān)鍵字可以在函數(shù)作用域中修改嵌套作用域中的變量。下面,帶大家看一個(gè)例子:
def func(): count = 1 def func_in(): count = 12 func_in() print(count) func() 1
上述代碼定義了一個(gè)嵌套函數(shù),其中,func為外層函數(shù),func_in為內(nèi)層函數(shù)。func函數(shù)中定義了一個(gè)變量count,func_in函數(shù)中對(duì)變量count重新賦值,并在func函數(shù)中輸出count變量的值。由執(zhí)行結(jié)果可知,內(nèi)層函數(shù)func_in并沒(méi)有對(duì)外層函數(shù)func中的變量count進(jìn)行修改。而是重新定義了一個(gè)同名的變量count。若要修改外層函數(shù)func中的變量count,則需要在變量前使用nonlocal關(guān)鍵字,改后的示例代碼如下:
def func(): count = 1 def func_in(): nonlocal count count = 12 func_in() print(count) func() 12
由執(zhí)行結(jié)果可知,內(nèi)層函數(shù)成功修改了變量的值。
注意:
使用global關(guān)鍵字修飾的變量之前可以不存在,而使用nonlocal關(guān)鍵字修飾的變量在嵌套作用域中必須已經(jīng)存在。
TiDB中有哪些組件?【TiDB架構(gòu)圖解】
2022-10-11傳智教育 x SelectDB公司 聯(lián)合推出Apache Doris中文視頻教程
2022-10-11傳智教育攜手天津經(jīng)開(kāi)區(qū)人社局推動(dòng)職業(yè)技能競(jìng)賽廣泛開(kāi)展
2022-10-11再升級(jí)!業(yè)務(wù)+技術(shù)并重,Python+大數(shù)據(jù)開(kāi)發(fā)課程V3.0
2022-10-11傳智教育出席ApacheCon Asia 2022開(kāi)源大會(huì),分享大數(shù)據(jù)&Python生態(tài)在傳智教育的實(shí)踐和思考
2022-10-11科學(xué)計(jì)算庫(kù)NumPy案例:酒鬼漫步
2022-10-10北京校區(qū)