天天看點

python中函數的定義和調用的先後順序問題

版權聲明:轉載請注明作者(獨孤尚良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!")
           

報錯如下圖所示。

python中函數的定義和調用的先後順序問題

這是因為執行到a()的時候程式還沒見過這個函數的定義。

第二個代碼驗證:

def a():
    b()

print("hey")
a()

def b():
    print("hello!")
           

報錯如下圖所示。

python中函數的定義和調用的先後順序問題

執行a()的時候程式見過了a()的定義,是以可以調用a(),但a()中調用的b()還沒見過,是以報錯。

獨孤尚良dugushangliang——著