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