91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python開發者遇到的UnboundLocalError錯誤怎么解決

發布時間:2022-01-17 15:27:19 來源:億速云 閱讀:247 作者:iii 欄目:大數據

這篇“Python開發者遇到的UnboundLocalError錯誤怎么解決”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Python開發者遇到的UnboundLocalError錯誤怎么解決”文章吧。

比如下面的代碼在 foo 函數中給 x 自增 1:

x = 10
def foo():
   x += 1
   print(x)
foo()

調用 foo() 的時候,堆棧日志告訴我們:局部變量 x 賦值前在其它地方被引用了,換句話說就是 x 在當前作用域內還沒有定義就拿來使用了。

Traceback (most recent call last):
 File "unboundtest.py", line 8, in <module>
   foo()
 File "unboundtest.py", line 4, in foo
   x += 1
UnboundLocalError: local variable 'x' referenced before assignment

明明 x 在函數 foo 的外面定義了,為什么卻告知我們說 x 沒賦值就被引用了呢?

因為這是幾乎每個人都會遇到的錯誤,所以 Python 官方把這個問題收入到了它的 FAQ 中,它是這樣說的:

This is because when you make an assignment to a variable in a scope, that variable becomes local to that scope and shadows any similarly named variable in the outer scope.

翻譯過來就是,當你在局部作用域中給變量賦值時,那么這個變量就會變成一個局部變量,不管它在外部有沒有初始化。如果外部作用域有相同名字的變量,那么對局部空間來說這些相同名字的全局變量都將被隱藏為不可見的。

在這里,x += 1 等價于 x = x + 1,首先會執行 x + 1 操作,然后再賦值給 x。而執行加法操作之前它會先查找變量 x,根據官方的這個解釋所述, Python 認為 x 對函數 foo 來說一個局部變量,因為它有賦值操作,既然 x 是局部變量,在執行加法操作時,又引用了 x,所以拋出了 UnboundLocalError 異常。

那么,該異常如何解決?辦法非常簡單,Python 提供了一個關鍵字 globlal,用來顯示地標識 x 為全局變量,x 設置為全局變量后,執行加操作的時候就會去全局命名空間查找 x 。

如果在局部作用域中沒有給變量 x 重新賦值,而是直接引用它,那么 Python 會沿著 LEGB(local->-enclosing->global->built-in) 的規則順序查找變量。

lst = [1, 2, 3]

def foo():
   lst.append(5)   # 正常執行,lst 沒有重新賦值,首先在局部作用域查找,沒找到再往全局作用域查找 lst
   #lst += [5]     # UnboundLocalError 錯誤,因為重新賦值了,而在局部作用域沒定義就引用了

foo()
print(lst)

這個問題解決之后,再來看另外一個類似的問題:

def external():
   x = 10
   def internal():
       x += 1
       print(x)
   internal()

external()

這是一個 Python 閉包,執行 external 函數的時候,看代碼你也知道會報同樣的 UnboundLocalError 錯誤,那么用 global 來 修復可行嗎?試試:

def external():
   x = 10
   def internal():
       global x
       x += 1
       print(x)
   internal()

external()

新的錯誤出現了, NameError: global name ‘x’ is not defined,全部變量 x 沒有定義,仔細想想也是啊,你看 x 是定義在 external 函數中的一個局部變量,現在你要把 internal 函數中的 x 聲明為全局變量,Python 在全局作用域空間 找不到 x ,所以出現了 NameError,那么這個問題又該如何解決呢?如果你是使用 Python3,恭喜你,Python3 中新增了一個關鍵字 nolocal,用于表示非局部變量。

用 dis.dis(foo) 可以看到 Python 內部字節碼指令的執行過程,從字節碼中可以知道,第三行代碼 x= x+1 操作的指令是 LOAD_FAST ,LOAD_FAST  0 (x) 表示 Python 解釋器 從局部作用域加載 x,而 x 由找不到,因此出現了UnboundLocalError。


3       0 LOAD_FAST          0 (x)
       3 LOAD_CONST         1 (1)
       6 INPLACE_ADD    
       7 STORE_FAST         0 (x)

4      10 LOAD_FAST          0 (x)
      13 PRINT_ITEM    
      14 PRINT_NEWLINE  
      15 LOAD_CONST         0 (None)
      18 RETURN_VALUE

以上就是關于“Python開發者遇到的UnboundLocalError錯誤怎么解決”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

肇州县| 民县| 南江县| 偏关县| 开鲁县| 奉贤区| 衡阳市| 绍兴市| 乾安县| 江都市| 黄浦区| 小金县| 郓城县| 托里县| 南川市| 邳州市| 镇原县| 上高县| 康马县| 宕昌县| 达拉特旗| 德保县| 象州县| 尖扎县| 连江县| 河间市| 达拉特旗| 栖霞市| 灌云县| 宝丰县| 永春县| 洞头县| 沙雅县| 曲阳县| 太湖县| 霸州市| 杭州市| 花莲市| 新平| 兴仁县| 慈溪市|