學(xué)習(xí)記錄-Python的局部變量和全局變量

1 定義

  • 在被調(diào)用函數(shù)內(nèi)賦值的變量是局部變量

  • 所有函數(shù)之外賦值的變量是全局變量

當(dāng)一個(gè)函數(shù)被調(diào)用的時(shí)候,就會(huì)創(chuàng)建一個(gè)局部作用域,在這個(gè)函數(shù)內(nèi)的所有變量都存在于該局部作用域內(nèi)(global的變量除外),該函數(shù)返回時(shí),這個(gè)局部作用域被銷毀,這個(gè)局部作用域內(nèi)的局部變量隨之丟失

2 作用域的重要性

  1. 全局作用域中的代碼不能使用任何局部變量

  2. 局部作用域中的代碼可以訪問全局變量

  3. 一個(gè)函數(shù)的局部作用域中的代碼,不能使用其他局部作用域中的變量

  4. 在不同的作用域中,可以使用相同的名字命名不同的變量

下面根據(jù)具體代碼舉例說明

2.1 全局作用域中的代碼不能使用任何局部變量

def spam():
    egg = 'this is in function spam'
    
spam()
print(egg)

在函數(shù)spam()(局部作用域)中給egg賦值,然后在全局作用域中調(diào)用函數(shù)spam()

運(yùn)行后顯示,egg未被定義

egg是局部變量,而print(egg)中的變量egg是全局變量,全局作用域中的代碼不能使用局部作用域中的變量

這一點(diǎn)我理解為:在調(diào)用子函數(shù)spam()時(shí),創(chuàng)建了一個(gè)局部作用域,并在局部作用域中定義了一個(gè)局部變量,當(dāng)子函數(shù)調(diào)用結(jié)束后,局部作用域和內(nèi)部定義的局部變量一起沒銷毀,因此在全局作用域中,找不到egg這個(gè)局部變量

2.2 局部作用域中的代碼可以訪問全局變量

def spam():
    print(egg)

egg = 'Outside the function'
spam()

全局變量在聲明或賦值時(shí)被創(chuàng)建,直到程序被終止或執(zhí)行結(jié)束

如果在egg賦值前調(diào)用函數(shù)

def spam():
    print(egg)

spam()
egg = 'Outside the function'

這時(shí)候會(huì)顯示變量未被定義

2.3 不同局部作用域中的變量不能相互調(diào)用

def spam():
    print(egg)

def init():
    egg = 'this is in init funcion'

init()
spam()

2.4 在不同的作用域中,可以使用相同的名字命名不同的變量

def spam():
    egg = 'this is in spam function'
    print(egg)

def init():
    egg = 'this is in init funcion'
    print(egg)

#egg = 'Out side function'
#print(egg)
init()
spam()

兩個(gè)子函數(shù)中都定義了變量egg,但在打印時(shí),互不影響

3 全局變量與局部變量同名

在上面說到,可以在局部作用域中調(diào)用全局變量,并且在給出的例子中,我們的子函數(shù)中只有一個(gè)print操作,但如果一個(gè)變量既在全局作用域中定義,又在局部作用域中定義,那么會(huì)出現(xiàn)什么樣的打印結(jié)果

def spam():
    egg = 'this is in spam function'
    print(egg)

def init():
    egg = 'this is in init funcion'
    print(egg)

egg = 'Out side function'
print(egg)
init()
spam()

這里我的理解是:在局部作用域要對(duì)一個(gè)變量進(jìn)行操作,Python會(huì)先在當(dāng)前局部作用域查找有沒有聲明這個(gè)變量,如果有,就優(yōu)先使用當(dāng)前局部作用域中的變量,如果當(dāng)前局部作用域作用域中沒有,才會(huì)去全局作用域中尋找

4 global

global允許在局部作用域中聲明全局變量

def spam():
    global egg
    egg = 'In spam function'

spam()
print(egg)

通過使用global語句在局部作用域中聲明了一個(gè)全局變量egg,當(dāng)函數(shù)spam()調(diào)用結(jié)束后變量egg并未隨之銷毀

5 全局變量和局部變量的優(yōu)先級(jí)

在上面的例子中說過,如果在全局變量和局部變量同名,那么局部作用域中會(huì)優(yōu)先處理在當(dāng)前作用域中聲明的的變量

用下面的例子進(jìn)一步說明這個(gè)問題

def spam():
    print(egg)
    egg = 'In spam function'

egg = 'Out side function'
spam()

報(bào)錯(cuò)顯示局部變量在賦值前被引用,就像前面所說,當(dāng)在局部作用域中處理一個(gè)變量時(shí),Python會(huì)先查看這個(gè)變量是否在局部作用域中進(jìn)行聲明,然后在會(huì)在全局作用域中查找這個(gè)變量的聲明

參考內(nèi)容

《Python編程快速上手》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容