python中全局變數和局部變數的一個小坑
python 中全局變數和局部變數在使用過程中的一個容易出錯的地方
什麼是全局變數
python中,在函數外部聲明的變數可以叫做全局變數。
x = 10
def fn1:
pass
fn1
什麼是局部變數
python中,在函數內部聲明的變數通常情況下稱之為局部變數,它的作用域也僅限在函數內部。
x = 10 # 全局變數
def fn1 :
y = 20 # 局部變數,只能夠在函數內部中使用
fn1 # 調用函數
容易出錯的一個點
在使用全局變數和局部變數的過程中,有一種情況十分容易出錯:
x = 10
def fn1 :
print(x)
fn1
上面這段代碼,主要是在函數fn1中調用了全局變數x ,那麼當函數調用的時候,輸出的結果為10
x = 10
def fn1:
x = 20
print(x)
fn1
print(x)
上面這段代碼的輸出結果為20、10,函數內部的print輸出的是函數內部的局部變數x,所以輸出結果為20,而在函數外部使用print輸出的結果為10,因為此時調用的是全局變數x,所以輸出為10
再來繼續看下面這段代碼:
x =10
def fn1:
print(x)
x = 20
fn1
一旦上面的這段代碼執行,程序看似沒什麼問題,但是實際卻會拋出一個錯誤,UnboundLocalError: local variable "x" referenced before assignment.
出現錯誤的原因是因為,全局變數在函數中只能夠查詢,但是卻不能夠修改。一旦修改就會報錯。
再來看剛才的一段代碼:
x = 10
def fn1:
x = 20
print(x)
fn1
print(x)
為什麼這段代碼沒有報錯呢?原因其實很簡單,因為在這段代碼中,函數外部的全局變數x值為10,但是在函數內部,第一句代碼就是重新的創建了一個變數x,值賦值為20,這個時候函數內部的x作用域是局部的,僅限於函數內部,而函數外部的x是全局的,作用域為全局。 在函數內部的代碼中,print還沒有輸出前,就重新聲明了個變數x,所以後面print輸出的x,應該為局部變數x。
而剛才拋出錯誤的代碼中是先使用的print輸出,而此時輸出的x為全局變數x,所以之後x = 20會拋出錯誤,因為python會認為,此時你不是單獨的創建一個局部變數而是在修改全局變數,這一點是python不允許的。
Tip:全局變數在函數中只能夠查看而不能夠修改。


※ABP從入門到精通(3):aspnet-zero-core 使用Redis緩存
※SQL SERVER Buffer Pool擴展
※原生js之千位分隔符
※Golang使用pprof和qcachegrind進行性能監控
※python中數字類型與處理工具
TAG:達人科技 |
※「Python」Chapter1 變數和簡單數據類型
※非靜態內部類中 static/final 成員變數相關的一道趣題
※static 成員變數、static 成員函數、類/對象的大小
※Python數據類型、運算符、變數
※Python和Scala的定義變數
※VBScript 變數
※Shell 變數
※python基礎之變數類型number(math模塊)
※Perl 變數
※全新斯巴魯Levorg問世有變數 EyeSight成拖累主因
※linux-shell編程中awk變數的使用
※Python基礎-變數、字元串、數字
※Nginx 日誌和變數
※Bash 環境變數的那些事
※python基礎之變數與運算符
※Flipkart-Walmart交易:軟銀最終會有變數嗎
※Python變數很難記?記住變數類型的三種方式
※nova5系列發布背後的華為變數
※The Daily Beast:美朝峰會出現變數,特朗普怪罪中國
※8 個有力的 Awk 內建變數