更新時間:2021-11-12 來源:黑馬程序員 瀏覽量:
Python變量并不是在哪個位置都可以訪問的,具體的訪問權(quán)限取決于變量定義的位置,其所處的有效范圍視為變量的作用域。根據(jù)作用域的不同,變量可以劃分為局部變量和全局變量。本節(jié)將針對局部變量和全局變量進行詳細地講解。
1.局部變量
在函數(shù)內(nèi)部定義的變量稱為局部變量,局部變量只能在定義它的函數(shù)內(nèi)部使用。
例如,定義一個包含局部變量count的函數(shù)test(),在函數(shù)的內(nèi)部和外部分別訪問變量count,代碼如下:
def test(): count=0 #局部變量 print (count) #函數(shù)內(nèi)部訪問局部變量 test() #函數(shù)外部訪問局部變量 print(count)
執(zhí)行程序,程序執(zhí)行的結(jié)果如下:
0 Traceback (most recent call last): File "C:/Osers/admin/FycharmProjects/測試/func.py",line 6,in <module> print (count) NameError: name 'count' is not defined
以上程序在打印count的值之后又打印了錯誤信息“name 'count'is not defined”由此可知,函數(shù)中定義的變量在函數(shù)內(nèi)部可使用,但無法在函數(shù)外部使用。
局部變量的作用域僅限于定義它的代碼段內(nèi),在同一個作用域內(nèi),不允許出現(xiàn)同名的變量。
2.全局變量
全局變量是指在函數(shù)之外定義的變量,它在程序的整個運行周期內(nèi)都占用存儲單元。默認情況下,函數(shù)的內(nèi)部只能獲取全局變量,而不能修改全局變量的值。例如,將前面定義的test()函數(shù)進行調(diào)整,如下所示:
count - 10 #全局變量 def test(): count=11 #實際上定義了局部變量,局部變量與全局變量重名 print (count) test () print(count)
以上代碼中首先在test()函數(shù)外定義了一個全局變量count,其次在該函數(shù)的內(nèi)部嘗試為count 重新賦值,然后在函數(shù)的內(nèi)部訪問了變量count,最后在執(zhí)行完函數(shù)后訪問變量count。
執(zhí)行程序,程序執(zhí)行的結(jié)果如下:
11 10
從以上結(jié)果可知,程序在函數(shù)test()內(nèi)部訪問的變量count為11,函數(shù)外部訪問的變量為10。也就是說,函數(shù)的內(nèi)部并沒有修改全局變量的值,而是定義了一個與全局變量同名的局部變量。
在函數(shù)內(nèi)部若要修改全局變量的值,需要提前使用保留字global進行聲明,語法格式如下:
global 全局變量
對以上定義的test()兩數(shù)再次進行調(diào)整,在該函數(shù)中對全局變量count進行修改,具體代碼如下所示:
count = 10 #全局變量 def test (): global count #聲明count為全局變量 count += 10 #函數(shù)內(nèi)修改count 變量 print(count) test() print(count)以上代碼首先定義了變量count并賦值為10,其次在test()函數(shù)內(nèi)部使用global保留字聲明count為全局變量,然后重新給count 變量賦值并將其輸出,最后在函數(shù)執(zhí)行完以后再次輸出。
執(zhí)行程序,程序執(zhí)行的結(jié)果如下:
20 20
觀察執(zhí)行結(jié)果,程序在函數(shù)內(nèi)部和外部獲得的變量count的值均為20。由此可知,在函數(shù)內(nèi)部使用關(guān)鍵字global對全局變量進行聲明后,函數(shù)中對全局變量進行的修改在整個程序中都有效。
LEGB法則:
Python中的作用城大致可以分為以下4種。
(1)L(local):局部作用域。
(2)E(enclosing):嵌套作用域fo
(3)G(global):全局作用域。
(4)B(built-in):內(nèi)置作用域。
基于LEGB法則,搜索變量名的優(yōu)先級是:局部作用域>嵌套作用域>全局作用域>內(nèi)置作用域。當函數(shù)中使用了未確定的變量名時,Python會按照優(yōu)先級依次搜索4個作用域,以此來確定該變量名的意義。首先搜索局部作用域(L),其次是上一層函數(shù)的嵌套作用域(E),然后是全局作用域(G),最后是內(nèi)置作用域(B)。接照LEGB原則查找變量,在某個區(qū)拔內(nèi)若找到變量,則停止繼續(xù)查找;若一直沒有找到變量,則直接引發(fā)NameError異常。
猜你喜歡:
在Postman中如何設(shè)置全局變量和環(huán)境變量?