全國(guó)咨詢(xún)/投訴熱線:400-618-4000

首頁(yè)技術(shù)文章正文

什么是局部變量?什么是全局變量?

更新時(shí)間:2021-11-12 來(lái)源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

Python變量并不是在哪個(gè)位置都可以訪問(wèn)的,具體的訪問(wèn)權(quán)限取決于變量定義的位置,其所處的有效范圍視為變量的作用域。根據(jù)作用域的不同,變量可以劃分為局部變量和全局變量。本節(jié)將針對(duì)局部變量和全局變量進(jìn)行詳細(xì)地講解。

1.局部變量

在函數(shù)內(nèi)部定義的變量稱(chēng)為局部變量,局部變量只能在定義它的函數(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)境變量?

postman全局變量和環(huán)境變量分別是什么?有什么區(qū)別?

Nginx rewrite常用全局變量詳細(xì)介紹

黑馬程序員Python+大數(shù)據(jù)開(kāi)發(fā)開(kāi)發(fā)工程師培訓(xùn)

分享到:
在線咨詢(xún) 我要報(bào)名
和我們?cè)诰€交談!