如何理解Python變數的作用域?正確的運用方法

2022-05-16 09:31:38 字數 2446 閱讀 8357

在寫**的時候,免不了要使用變數。但程式中的乙個變數並不一定是在**都可以被使用,根據情況不同,會有不同的「有效範圍」。

看這樣一段**:

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

這就得說一下變數的「作用域」:

當函式內部定義了乙個變數,無論是作為函式的形參,或是另外定義的變數,它都只在這個函式的內部起作用。函式外即使有和它名稱相

同的變數,也沒有什麼關聯。這個函式體就是這個變數的作用域。像這樣在函式內部定義的變數被稱為「區域性變數」。

要注意的是,作用域是從變數被定義的位置開始。像這樣的寫法是有問題的:

def func():

print (y)

y = 2

print (y)

報錯:

unboundlocalerror: local variable 'y' referenced before assignment
因為在 y = 2 之前,y 並不存在,呼叫 y 的值就會出錯。

回到開始那個例子:

在函式 func 外部,定義的變數 x,賦值為 50,作為引數傳給了函式 func。而在函式 func 內部,變數 x 是形參,它的作用域是整個函式體內部。它與外面的那個 x 沒有關係。只不過它的初始值是由外面那個 x 傳遞過來的。

所以,雖然函式體內部的 x 被重新賦值為 2,也不會影響外面那個 x 的值。

不過有時候,我們希望能夠在函式內部去改變一些變數的值,並且這些變數在函式外部同樣被使用到。怎麼辦?

一種方法是,用 return 把改變後的變數值作為函式返回值傳遞出來,賦值給對應的變數。比如開始的那個例子,可以在函式結尾加上

return x
然後把呼叫改為

x = func(x)
還有一種方法,就是使用「全域性變數」。

在 python 的函式定義中,可以給變數名前加上 global 關鍵字,這樣其作用域就不再侷限在函式塊中,而是全域性的作用域。

通過 global 改寫開始的例子:

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

函式 func 不再提供引數呼叫。而是通過 global x 告訴程式:這個 x 是乙個全域性變數。於是函式中的 x 和外部的 x 就成為了同乙個變

量。這一次,當 x 在函式 func 內部被重新賦值後,外部的 x 也隨之改變。

前面講的區域性變數和全域性變數是 python 中函式作用域最基本的情況。實際上,還有一些略複雜的情況,比如:

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

程式可以正常執行。雖然沒有指明 global,函式內部還是使用到了外部定義的變數。然而一旦加上

x = 2
這句,程式就會報錯。因為這時候,x 成為乙個區域性變數,它的作用域從定義處開始,到函式體末尾結束。

建議在寫**的過程中,顯式地通過 global 來使用全域性變數,避免在函式中直接使用外部變數。

最後注意:

python變數的作用域如何理解?

變數作用域 一般在函式體外定義的變數成為全域性變數,在函式內部定義的變數稱為區域性變數。全域性變數所有作用域都可讀,區域性變數只能在本函式可讀 函式在讀取變數時,優先讀取函式本身自有的區域性變數,再去讀全域性變數 全域性變數 例如 name tim 全域性變數 deff1 age 18 區域性變數 ...

有關python中變數的作用域理解

author 有關python中變數的作用域理解 例如 閉包的使用中分別用list列表變數和整形變數實現計數器 下列是計數器list列表變數的實現 def count first 0 cnt first def add one cnt 0 1 return cnt 0 return add one ...

php理解變數的作用域

作用域是指在乙個指令碼中某個變數可以使用或可見的範圍,php具有6項基本的作用域規則。1.內建超級全域性變數可以在指令碼的任何地方使用和可見。2.常量,一旦被宣告,將可以在全域性可見 也就是說,它們在函式內外都可以使用。3.在乙個指令碼中宣告的全域性變數在整個指令碼中是可見的,但在函式內部不行。4....