溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Python變量的作用域有什么用

發(fā)布時(shí)間:2020-07-02 10:52:09 來(lái)源:億速云 閱讀:135 作者:清晨 欄目:編程語(yǔ)言

小編給大家分享一下Python變量的作用域有什么用,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討方法吧!

在寫(xiě)代碼的時(shí)候,免不了要使用變量。但程序中的一個(gè)變量并不一定是在哪里都可以被使用,根據(jù)情況不同,會(huì)有不同的“有效范圍”。

看這樣一段代碼:

def func(x):
    print ('X in the beginning of func(x): ', x)
    x = 2
    print ('X in the end of func(x): ', x)
    
x = 50func(x)print ('X after calling func(x): ', x)

輸出:

X in the beginning of func(x):  50
X in the end of func(x):  2
X after calling func(x):  50

變量 x 在函數(shù)內(nèi)部被重新賦值。但在調(diào)用了函數(shù)之后,x 的值仍然是50。為什么?

這就得說(shuō)一下變量的“作用域”:

當(dāng)函數(shù)內(nèi)部定義了一個(gè)變量,無(wú)論是作為函數(shù)的形參,或是另外定義的變量,它都只在這個(gè)函數(shù)的內(nèi)部起作用。函數(shù)外即使有和它名稱(chēng)相

同的變量,也沒(méi)有什么關(guān)聯(lián)。這個(gè)函數(shù)體就是這個(gè)變量的作用域。像這樣在函數(shù)內(nèi)部定義的變量被稱(chēng)為“局部變量”。

要注意的是,作用域是從變量被定義的位置開(kāi)始。像這樣的寫(xiě)法是有問(wèn)題的:

def func():
    print (y)
    y = 2
    print (y)

報(bào)錯(cuò):

UnboundLocalError: local variable 'y' referenced before assignment

因?yàn)樵?y = 2 之前,y 并不存在,調(diào)用 y 的值就會(huì)出錯(cuò)。

回到開(kāi)始那個(gè)例子:

在函數(shù) func 外部,定義的變量 x,賦值為 50,作為參數(shù)傳給了函數(shù) func。而在函數(shù) func 內(nèi)部,變量 x 是形參,它的作用域是整個(gè)函數(shù)體內(nèi)部。它與外面的那個(gè) x 沒(méi)有關(guān)系。只不過(guò)它的初始值是由外面那個(gè) x 傳遞過(guò)來(lái)的。

所以,雖然函數(shù)體內(nèi)部的 x 被重新賦值為 2,也不會(huì)影響外面那個(gè) x 的值。

不過(guò)有時(shí)候,我們希望能夠在函數(shù)內(nèi)部去改變一些變量的值,并且這些變量在函數(shù)外部同樣被使用到。怎么辦?

一種方法是,用 return 把改變后的變量值作為函數(shù)返回值傳遞出來(lái),賦值給對(duì)應(yīng)的變量。比如開(kāi)始的那個(gè)例子,可以在函數(shù)結(jié)尾加上

return x

然后把調(diào)用改為

x = func(x)

還有一種方法,就是使用“全局變量”。

在 Python 的函數(shù)定義中,可以給變量名前加上 global 關(guān)鍵字,這樣其作用域就不再局限在函數(shù)塊中,而是全局的作用域。

通過(guò) global 改寫(xiě)開(kāi)始的例子:

def func():
    global x    print ('X in the beginning of func(x): ', x)
    x = 2
    print ('X in the end of func(x): ', x)
    
x = 50func()print ('X after calling func(x): ', x)

輸出:

X in the beginning of func(x):  50
X in the end of func(x):  2
X after calling func(x):  2

函數(shù) func 不再提供參數(shù)調(diào)用。而是通過(guò) global x 告訴程序:這個(gè) x 是一個(gè)全局變量。于是函數(shù)中的 x 和外部的 x 就成為了同一個(gè)變

量。這一次,當(dāng) x 在函數(shù) func 內(nèi)部被重新賦值后,外部的 x 也隨之改變。

前面講的局部變量和全局變量是 Python 中函數(shù)作用域最基本的情況。實(shí)際上,還有一些略復(fù)雜的情況,比如:

def func():
    print ('X in the beginning of func(x): ', x)    # x = 2
    print ('X in the end of func(x): ', x)
    
x = 50func()print ('X after calling func(x): ', x)

輸出:

X in the beginning of func(x):  50
X in the end of func(x):  50
X after calling func(x):  50

程序可以正常運(yùn)行。雖然沒(méi)有指明 global,函數(shù)內(nèi)部還是使用到了外部定義的變量。然而一旦加上

x = 2

這句,程序就會(huì)報(bào)錯(cuò)。因?yàn)檫@時(shí)候,x 成為一個(gè)局部變量,它的作用域從定義處開(kāi)始,到函數(shù)體末尾結(jié)束。

建議在寫(xiě)代碼的過(guò)程中,顯式地通過(guò) global 來(lái)使用全局變量,避免在函數(shù)中直接使用外部變量。

看完了這篇文章,相信你對(duì)Python變量的作用域有什么用有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI