2013-04-02 15 views
0
def print_list(l): 
    for item in l: 
     if isinstance(item, list): 
      print_list(item) 
     else: 
      print(item) 

我寫了這個功能,使用遞歸正常打印的清單,但我的問題是,當我把它根據我顯示3後應終止像[[1, 2, 3], 4]的說法,但它仍能正常顯示所有4個值都是什麼原因,有人可以啓發我。列表功能的演技意外

+0

注意類型檢查像這樣的是一個壞主意,因爲這將意味着它不會與其他iterables,這使你的函數小靈活的工作。 –

+0

您需要查看['pprint'](http://docs.python.org/2/library/pprint.html)模塊。 –

回答

4

我想你誤解了遞歸。

外列表有兩個項,一個列表,以及一個數4. print_list()函數調用print_list()再次打印的內部列表,然後調用print(4)爲第二元件。

所以,這是發生了什麼:

  1. print_list([[1, 2, 3], 4]) - >環比2項

    1. print_list([1, 2, 3]) - >循環超過3項

      1. print(1)
      2. print(2)
      3. print(3)

    2. print(4)

+0

哦,我明白了... – user2189524

0

當我嘗試你的函數,我得到

1 
2 
3 
4 

作爲輸出。這正是你所期望的,因爲你的函數首先進入遞歸,循環遍歷[1, 2, 3]。這打印13。然後,遞歸結束,返回到原始調用,即打印外部列表中的第二個元素,即4

0

你爲什麼期望程序終止於三? 如果您說遞歸停止並且打印輸出爲三,但此時還沒有完全處理原始列表,那麼您是對的。如果你寫下你的程序的步驟,它可以這樣寫:

  • 迭代的迭代器[1,2,3,4]
  • 是第一項[1,2,3的所有元素] 一個列表? - >是
  • 呼叫print_list與第一項
    • 遍歷所有項目中[1,2,3]
    • 是第一項1列表? - >否
    • print 1
    • 是第二項2列表嗎? - >否
    • print 2
    • 是第三項3列表? - >無
    • 打印3
    • 達成列表的末尾等回去
  • 是第二個項目4名單? - >無
  • 打印4