Python 是一門非常流行的編程語言,它有著廣泛的應(yīng)用場景。在 Python 的執(zhí)行過程中,有一些特定的時(shí)機(jī)是需要注意的。
在 Python 解釋器加載代碼時(shí),會(huì)先執(zhí)行程序的全局代碼。在全局代碼執(zhí)行完成后,如果存在函數(shù)定義的話,則會(huì)將其代碼對(duì)象加載到內(nèi)存中。當(dāng)調(diào)用一個(gè)函數(shù)時(shí),Python 解釋器會(huì)創(chuàng)建一個(gè)新的棧幀,并在其中運(yùn)行函數(shù)的代碼。
def print_hello(): print("Hello!") print_hello()
上述代碼中,Python 解釋器首先創(chuàng)建一個(gè)全局棧幀,并載入 print_hello 函數(shù)的代碼對(duì)象。當(dāng)程序執(zhí)行到 print_hello 函數(shù)的調(diào)用時(shí),Python 解釋器創(chuàng)建一個(gè)新的棧幀,并將其壓入函數(shù)調(diào)用棧。在這個(gè)新的棧幀中,解釋器會(huì)運(yùn)行 print_hello 函數(shù)的代碼。
當(dāng)函數(shù)執(zhí)行返回時(shí),Python 解釋器會(huì)將該函數(shù)棧幀彈出函數(shù)調(diào)用棧,并恢復(fù)原來的棧幀。如果程序沒有其他代碼要執(zhí)行,那么 Python 解釋器就會(huì)退出程序。
def foo(): return "foo" def bar(): return "bar" print(foo()) print(bar())
上述代碼中,Python 解釋器先加載兩個(gè)函數(shù)的代碼對(duì)象,并創(chuàng)建全局棧幀。當(dāng)程序執(zhí)行到第一個(gè) print 函數(shù)時(shí),Python 解釋器會(huì)創(chuàng)建 foo 函數(shù)棧幀,并執(zhí)行 foo 函數(shù)的代碼。當(dāng) foo 函數(shù)執(zhí)行完畢后,Python 解釋器將其棧幀彈出函數(shù)調(diào)用棧,并返回 foo 函數(shù)的結(jié)果。此時(shí),Python 解釋器創(chuàng)建第二個(gè)棧幀用于執(zhí)行 bar 函數(shù),并返回其結(jié)果。
總結(jié)來說,Python 解釋器是按需執(zhí)行函數(shù)的,它會(huì)在需要執(zhí)行函數(shù)時(shí)創(chuàng)建一個(gè)新的棧幀,并在其中運(yùn)行函數(shù)代碼。當(dāng)函數(shù)執(zhí)行完成并返回結(jié)果后,Python 解釋器會(huì)將其棧幀彈出函數(shù)調(diào)用棧,并恢復(fù)原來的棧幀。這樣,在程序執(zhí)行結(jié)束時(shí),Python 解釋器將不再有任何棧幀在函數(shù)調(diào)用棧中。