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