2012-03-13 53 views
0

我想在Python中做這樣的事情。我拿出了我們真正在做的事情,並用這個永遠不會結束的荒謬例子取而代之。請假定來自< ==> b的呼叫是有限的。我們的代碼確實有結束這個循環的邏輯。python 2.7原型/前向參考

我很擔心我會在定義b之前調用b的錯誤。不過,我讀到,只要我沒有打電話執行一個之前的def b,那麼我應該沒有問題。這裏真正的答案是什麼?什麼是蟒蛇做幕後製作第2行就不會退出(B())

def a(): 
    b() 

def b(): 
    a() 

b() 
+0

你爲什麼不試試這個呢?如果你真的不想在本地機器上處理這個問題,可以在http://ideone.com上試試。 – Marcin 2012-03-13 11:13:47

+0

我測試過了。我顯然忘了添加關於它爲什麼起作用的部分。我編輯它。 – Jake 2012-03-13 11:16:35

+0

@Jake:我沒有得到你編輯的最後一句話。爲什麼腳本會在第2行退出? – 2012-03-13 11:18:25

回答

3

真正的答案是,ba定義內將在模塊範圍內進行查找,類似的還有ab定義內。由於ab在處理完兩個定義後都存在於模塊範圍中,因此您的相互遞歸將起作用。

(它會停止,如果名稱ab的函數定義裏面陰影的工作,但我相信你會設法避免。)

了Python作用域規則概述,請參閱this question

+0

太好了。兩者都解釋了它的工作原理和原因。 – Jake 2012-03-13 11:18:32

1

這將做工精細,高達1000個呼叫的遞歸深度。這取決於你使用它的是否這是一個問題。

檢查做遞歸函數的搜索,找出更多...

+1

這不是一個答案。 – Marcin 2012-03-13 11:13:27

+0

答案是事實。對於「是否有效」這個問題,答案是肯定的。 – Jake 2012-03-13 11:18:05

+0

@Marcin - 這是一個答案,問題是否代碼會起作用,我回答說是,最多可以撥打1000個電話。 – fraxel 2012-03-13 11:19:09