2010-08-25 79 views
0

我不知道該怎麼稱呼它,所以如果有人想編輯它:繼續。Python定義依賴於其他未定義的定義?

def Function_A() 
print "We're going to function B!" 
Function_B() 

def Function_B() 
print "We made it!' 

這是一個初學者的問題,但解決方案並沒有發生在我身上,因爲我被編譯語言寵壞了。你可以在這裏看到,Function_A通向Function_B。在運行時,函數_A被調用時,函數_B將不會被定義,所以它不會發生。我如何解決這個問題?

+0

順便說一句,我知道我可以把Function_B以上Function_A。但是,假設我有三個功能都相互依賴。移動一個函數永遠不會停止,它永遠不會工作。這是我的問題。大聲笑 – Reznor 2010-08-25 21:56:37

回答

5

在Python中,函數不需要按使用順序進行定義。只要它在函數調用運行時之前的某個地方定義,它應該可以工作。這是因爲Function_A()實際上並沒有被調用,直到它被調用,在這種情況下是在這個test.py文件的底部,在這一點上Function_B()已經被定義。

test.py:

def Function_A(): 
    print "We're going to function B!" 
    Function_B() 

def Function_B(): 
    print "We made it!!" 

Function_A() 

實例運行:

mahmoud:~$ python test.py
We're going to function B!
We made it!!

+0

我想在你調用'Function_A()'的時候去掉分號。這在技術上是合法的,但它看起來不太pythonic。除此之外,答案是完全正確的,所以+1。 – 2010-08-25 22:05:45

+0

糟糕,固定。謝謝。 – Mahmoud 2010-08-25 22:16:22

1

你有兩個問題,我可以看到。一,def後需要冒號。二:你在最後一個字符串上混合了打開/關閉引號。

def Function_A(): 
print "We're going to function B!" 
Function_B() 

def Function_B(): 
print "We made it!" 

否則,此代碼將按照發布的方式工作。運行這些功能我沒有問題。

2

函數名在運行時解析。因此,當Function_A調用Function_B時,只有在Function_A實際進行調用之前,纔會查找名稱「Function_B」。因此,只要Function_B由Function_A實際調用的時間定義,一切正常。這一點,例如,將工作:

def Function_A(): 
    print "Function A entered" 
    Function_B() 

Function_A() 

def Function_B(): 
    print "Function B entered" 

...因爲調用Function_A是Function_B的定義之前。

2

正如所寫,兩個函數都被定義了,但是這兩個函數都沒有被調用。

如果你打電話Function_AFunction_B的定義,你會得到一個錯誤:如果你調用Function_AFunction_B一切的定義將正常工作

def Function_A(): 
print "We're going to function B!" 
Function_B() 

Function_A() # will fail 

def Function_B(): 
print "We made it!" 

def Function_A(): 
print "We're going to function B!" 
Function_B() 

def Function_B(): 
print "We made it!" 

Function_A() # will succeed 

解釋器從頭到尾執行文件,定義和調用函數。只有在函數被調用時纔會仔細觀察函數體。

執行Function_A併到達第二行時,解釋器將查找全局名稱空間以查找名爲Function_B的東西。在第一個例子中,還沒有定義任何東西,而在第二個例子中有一個可以調用的Function_B

2

正如其他人所說的,當調用Function_A時,會查找Function_B。下面是一個示例,顯示Function_B甚至可以重新定義並仍然正常工作。

def Function_A(): 
    print "We're going to function B!" 
    Function_B() 

# Function_A() # This would cause a NameError 

def Function_B(): 
    print "We made it!" 

Function_A() 

def Function_B(): 
    print "Function B has been redefined!" 

Function_A() 

輸出:

We're going to function B!
We made it!
We're going to function B!
Function B has been redefined!