問題
在寫程式碼是遇到了一個奇怪的問題,local variable 'siteName' referenced before assignment, 特此記錄一下,這裡其實是變數作用域的問題,平時開發中大家也會經常用到。
復現問題
程式碼如下:
siteName = 'pythontab' def localVar(flag): if flag: siteName = 'pythontab.com' else: print('ok') return siteName localVar(0)
結果:
Traceback (most recent call last): File "localVar.py", line 10, in <module> localVar(0) File "localVar.py", line 8, in localVar return siteName UnboundLocalError: local variable 'siteName' referenced before assignment
上面這句話的意思是:本地變數siteName引用前沒定義。
解決問題
問題出在哪呢?我猜測可能是在給函式內siteName賦值時出錯了, 雖然這裡並沒有走這個if得分支,下面透過程式碼驗證一下
siteName = 'pythontab' def localVar(flag): if flag: pythontabName = siteName else: print('ok') return siteName localVar(0)
這時候得結果是:
ok
到這裡我們大致清楚了,原來全域性變數是可以在函式內讀取,但是不能被重新賦值得, 如果想重新賦值,那麼需要透過關鍵字global
siteName = 'pythontab' def localVar(flag): global siteName if flag: siteName = 'pythontab.com' else: print('ok') return siteName localVar(0)
這個時候就OK了
總結
在於python沒有變數的宣告 , 所以它透過一個簡單的規則找出變數的範圍 :如果有一個函式內部的變數賦值 ,該變數被認為是本地的,所以如果有修改變數的值就會變成區域性變數。