欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Python開(kāi)發(fā)者遇到的UnboundLocalError錯(cuò)誤怎么解決

這篇“Python開(kāi)發(fā)者遇到的UnboundLocalError錯(cuò)誤怎么解決”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“Python開(kāi)發(fā)者遇到的UnboundLocalError錯(cuò)誤怎么解決”文章吧。

為新城等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及新城網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為做網(wǎng)站、網(wǎng)站設(shè)計(jì)、新城網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

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

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

調(diào)用 foo() 的時(shí)候,堆棧日志告訴我們:局部變量 x 賦值前在其它地方被引用了,換句話說(shuō)就是 x 在當(dāng)前作用域內(nèi)還沒(méi)有定義就拿來(lái)使用了。

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 在函數(shù) foo 的外面定義了,為什么卻告知我們說(shuō) x 沒(méi)賦值就被引用了呢?

因?yàn)檫@是幾乎每個(gè)人都會(huì)遇到的錯(cuò)誤,所以 Python 官方把這個(gè)問(wèn)題收入到了它的 FAQ 中,它是這樣說(shuō)的:

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.

翻譯過(guò)來(lái)就是,當(dāng)你在局部作用域中給變量賦值時(shí),那么這個(gè)變量就會(huì)變成一個(gè)局部變量,不管它在外部有沒(méi)有初始化。如果外部作用域有相同名字的變量,那么對(duì)局部空間來(lái)說(shuō)這些相同名字的全局變量都將被隱藏為不可見(jiàn)的。

在這里,x += 1 等價(jià)于 x = x + 1,首先會(huì)執(zhí)行 x + 1 操作,然后再賦值給 x。而執(zhí)行加法操作之前它會(huì)先查找變量 x,根據(jù)官方的這個(gè)解釋所述, Python 認(rèn)為 x 對(duì)函數(shù) foo 來(lái)說(shuō)一個(gè)局部變量,因?yàn)樗匈x值操作,既然 x 是局部變量,在執(zhí)行加法操作時(shí),又引用了 x,所以拋出了 UnboundLocalError 異常。

那么,該異常如何解決?辦法非常簡(jiǎn)單,Python 提供了一個(gè)關(guān)鍵字 globlal,用來(lái)顯示地標(biāo)識(shí) x 為全局變量,x 設(shè)置為全局變量后,執(zhí)行加操作的時(shí)候就會(huì)去全局命名空間查找 x 。

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

lst = [1, 2, 3]

def foo():
   lst.append(5)   # 正常執(zhí)行,lst 沒(méi)有重新賦值,首先在局部作用域查找,沒(méi)找到再往全局作用域查找 lst
   #lst += [5]     # UnboundLocalError 錯(cuò)誤,因?yàn)橹匦沦x值了,而在局部作用域沒(méi)定義就引用了

foo()
print(lst)

這個(gè)問(wèn)題解決之后,再來(lái)看另外一個(gè)類似的問(wèn)題:

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

external()

這是一個(gè) Python 閉包,執(zhí)行 external 函數(shù)的時(shí)候,看代碼你也知道會(huì)報(bào)同樣的 UnboundLocalError 錯(cuò)誤,那么用 global 來(lái) 修復(fù)可行嗎?試試:

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

external()

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

用 dis.dis(foo) 可以看到 Python 內(nèi)部字節(jié)碼指令的執(zhí)行過(guò)程,從字節(jié)碼中可以知道,第三行代碼 x= x+1 操作的指令是 LOAD_FAST ,LOAD_FAST  0 (x) 表示 Python 解釋器 從局部作用域加載 x,而 x 由找不到,因此出現(xiàn)了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

以上就是關(guān)于“Python開(kāi)發(fā)者遇到的UnboundLocalError錯(cuò)誤怎么解決”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站欄目:Python開(kāi)發(fā)者遇到的UnboundLocalError錯(cuò)誤怎么解決
地址分享:http://chinadenli.net/article28/jpsccp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)域名注冊(cè)標(biāo)簽優(yōu)化關(guān)鍵詞優(yōu)化虛擬主機(jī)小程序開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站