版權聲明:轉載請注明作者(獨孤尚良dugushangliang)出處: https://blog.csdn.net/dugushangliang/article/details/89016588
踩過多少次坑後,意識到這個問題得好好琢磨琢磨,是以現在記錄下想明白了的其中的情況。
python是不需要先編譯的,是以這決定了你調用函數之前得知道有這個函數,是以執行代碼前需要有要用到的函數的定義。
def a():
print("hello!")
print("hey")
a()
上面這個代碼執行的時候,首先是知道有一個函數a(),但不看這個函數裡面的内容,繼續執行下面的代碼,當執行過print("hey")後要執行a()時,調用之前記錄下的函數a(),如果a()的定義放在後面,則程式不知道有這個函數,則會報錯。
那麼為什麼函數之間互相調用不需要先後順序呢?
def a():
b()
def b():
print("hello!")
print("hey")
a()
上面的代碼為什麼可以正确執行呢?看我剛剛說的話。
程式執行的時候,讀取到函數的定義的時候,這是記錄下函數的名單,知道有這麼些函數,但是不看函數裡面的内容,當需要執行函數的時候才去讀取這個函數裡面的内容。
上面的代碼在執行的時候,程式先見了a()的定義,又見了b()的定義,再執行a()的時候,直接去找程式見過的函數了。如果調用函數的時候程式還沒見過這個函數,是不能成功運作的。
可以看下面的代碼驗證這個想法。
第一個代碼驗證:
print("hey")
a()
def a():
b()
def b():
print("hello!")
報錯如下圖所示。
這是因為執行到a()的時候程式還沒見過這個函數的定義。
第二個代碼驗證:
def a():
b()
print("hey")
a()
def b():
print("hello!")
報錯如下圖所示。
執行a()的時候程式見過了a()的定義,是以可以調用a(),但a()中調用的b()還沒見過,是以報錯。
獨孤尚良dugushangliang——著