溫馨提示×

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

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

解決Python 函數(shù)聲明先后順序出現(xiàn)的問(wèn)題

發(fā)布時(shí)間:2020-10-08 20:56:22 來(lái)源:腳本之家 閱讀:156 作者:Yanbin 欄目:開(kāi)發(fā)技術(shù)

在 Python 中如果把函數(shù)定義寫(xiě)在調(diào)用的下方可能會(huì)出錯(cuò),例如下面的代碼

foo()

def foo():
 print("hello")

執(zhí)行時(shí)會(huì)報(bào)出錯(cuò)誤

NameError: name 'foo' is not defined

這時(shí)候要把 foo() 調(diào)用代碼放到該函數(shù)的聲明后面

def foo():
 print("hello")

foo()

這樣執(zhí)行就一切正常了。這仿佛像是 C 語(yǔ)言中的函數(shù)調(diào)用需要提前聲明一般,例如在 C 語(yǔ)言中要調(diào)用后頭的定義的函數(shù)要寫(xiě)成

void foo();
 
int main() {
 foo();
}
 
void foo() {
 printf("Hello");
}

實(shí)際上 Python 中并不存在函數(shù)提前聲明一說(shuō),也不能像 Java 那樣函數(shù)可以寫(xiě)在任意位置,因?yàn)?Java 是編譯型的語(yǔ)言,Python 是解釋型的。

而且也不是一定要求被調(diào)用的函數(shù)一定要在源代碼層面上定義在調(diào)用者前方。

Python 中函數(shù)聲明的順序據(jù)我理解有兩條規(guī)則

  • Python 源代碼是由上往下解釋的
  • 找到程序入口(未包含在函數(shù)中的代碼) 即開(kāi)始執(zhí)行,執(zhí)行到的函數(shù)未被先行解釋到即報(bào)錯(cuò)

分析下面兩段代碼

def foo():
 bar()
 
if __name__ == '__main__':
 foo()
 
def bar():
 print("hello")

Python 從第 1 行一直解釋到第 4 行的入口,進(jìn)而往回跳,調(diào)用到第 1 行的 foo() 函數(shù),而其中的 bar() 函數(shù)還未及被解釋到,所以會(huì)提示

NameError: name 'bar' is not define

有一個(gè)很好的分析工具 http://pythontutor.com/live.html#mode=edit,我們來(lái)看上面的代碼

解決Python 函數(shù)聲明先后順序出現(xiàn)的問(wèn)題

解釋到第二行 bar() 的時(shí)候,Global frame 里只有 foo, bar 還不存在

如果把程序入口往后調(diào)

def foo():
 bar()
 
def bar():
 print("hello")
 
if __name__ == '__main__':
 foo()

上面代碼執(zhí)行無(wú)誤,輸出

hello

foo() 調(diào)用的 bar() 不也是在它下方聲明的嗎?所以這一點(diǎn)與 C 是有區(qū)別的。

也用http://pythontutor.com/live.html#mode=edit 來(lái)看看

解決Python 函數(shù)聲明先后順序出現(xiàn)的問(wèn)題

解釋到第 8 行的時(shí)候在 Global frame 中 foo, bar 都有了,所以能成功調(diào)用。

這時(shí)候的理解是這樣的,Python 從第 1 行自上往下解釋到第 7 行的程序入口時(shí),foo() 并未實(shí)際調(diào)用 bar(),但 foo() 和 bar() 函數(shù)都已解釋到了,所以回過(guò)頭來(lái) foo() 與 bar() 之間怎么調(diào)用都無(wú)妨。

因此,最好的實(shí)踐方法就是把程序的入口放到代碼的最下方,那么它前面的函數(shù)不管如何的聲明順序都沒(méi)有關(guān)系。

以上就是解決Python 函數(shù)聲明先后順序的問(wèn)題的詳細(xì)內(nèi)容,更多關(guān)于python 函數(shù)聲明順序的資料請(qǐng)關(guān)注億速云其它相關(guān)文章!

向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