
在寫代碼的時候,免不了要使用變數,但程式中的一個變數并不一定是在哪里都可以被使用,根據情況不同,會有不同的“有效范圍”,
看這樣一段代碼:
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 在函式內部被重新賦值,但在呼叫了函式之后,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 來使用全域變數,避免在函式中直接使用外部變數
最后注意:光理論是不夠的,這里順便送大家一套2020最新python入門到高級專案實戰視頻教程,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,還可以跟老司機交流討教!
本文的文字及圖片來源于網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/146292.html
標籤:Python
