問題解決local variable 'xxx' referenced before assignment

pythontab發表於2018-10-10

問題

在寫程式碼是遇到了一個奇怪的問題,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沒有變數的宣告 , 所以它透過一個簡單的規則找出變數的範圍 :如果有一個函式內部的變數賦值 ,該變數被認為是本地的,所以如果有修改變數的值就會變成區域性變數。


相關文章