溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

怎么避免誤用Python作用域的規(guī)則

發(fā)布時(shí)間:2020-08-25 11:31:45 來(lái)源:億速云 閱讀:133 作者:Leah 欄目:編程語(yǔ)言

這篇文章運(yùn)用簡(jiǎn)單易懂的例子給大家介紹怎么避免誤用Python作用域的規(guī)則,代碼非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

誤用Python作用域的規(guī)則

Python的作用域解析是基于叫做LEGB(Local(本地),Enclosing(封閉),Global(全局),Built-in(內(nèi)置))的規(guī)則進(jìn)行操作的。這看起來(lái)很直觀,對(duì)吧?事實(shí)上,在Python中這有一些細(xì)微的地方很容易出錯(cuò)。看這個(gè)例子:

>>> x = 10
>>> def foo():
...     x += 1
...     print x
...
>>> foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in foo
UnboundLocalError: local variable 'x' referenced before assignment

這是怎么回事?

這是因?yàn)?,在一個(gè)作用域里面給一個(gè)變量賦值的時(shí)候,Python自動(dòng)認(rèn)為這個(gè)變量是這個(gè)作用域的本地變量,并屏蔽作用域外的同名的變量。

很多時(shí)候可能在一個(gè)函數(shù)里添加一個(gè)賦值的語(yǔ)句會(huì)讓你從前本來(lái)工作的代碼得到一個(gè)UnboundLocalError。(感興趣的話(huà)可以讀一讀這篇文章。)

在使用列表(lists)的時(shí)候,這種情況尤為突出。看下面這個(gè)例子:

>>> lst = [1, 2, 3]
>>> def foo1():
...     lst.append(5)   
# 這沒(méi)有問(wèn)題...
...
>>> foo1()
>>> lst
[1, 2, 3, 5]
 
>>> lst = [1, 2, 3]
>>> def foo2():
...     lst += [5]      
# ... 這就有問(wèn)題了!
...
>>> foo2()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in foo
UnboundLocalError: local variable 'lst' referenced before assignment

嗯?為什么foo2有問(wèn)題,而foo1沒(méi)有問(wèn)題?

答案和上一個(gè)例子一樣,但是更加不易察覺(jué)。foo1并沒(méi)有給lst賦值,但是foo2嘗試給lst賦值。注意lst+=[5]只是lst=lst+[5]的簡(jiǎn)寫(xiě),由此可以看到我們嘗試給lst賦值(因此Python假設(shè)作用域?yàn)楸镜兀?。但是,這個(gè)要賦給lst的值是基于lst本身的(這里的作用域仍然是本地),而lst卻沒(méi)有被定義,這就出錯(cuò)了。

關(guān)于怎么避免誤用Python作用域的規(guī)則就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI