2014-02-15 56 views
6

我有以下的遞歸函數:Python:通過遞歸函數調用傳遞列表會導致列表變爲'NoneType',爲什麼?

def recurse(y,n): 
    if len(y) == n: 
     return y 
    else: 
     return recurse(y.append(1),n) 

當我運行它:

x=recurse([],10) 

我收到以下錯誤:

TypeError: object of type 'NoneType' has no len() 

看來,功能得到過去,如果語句,然後它進入遞歸的下一級,在那裏,y.append(1)是'NoneType',爲什麼不是:'[1]'如預期的那樣?我已經考慮了一段時間,我似乎無法弄清楚。任何見解都被讚賞!

回答

9

的問題是在這裏:

y.append(1) 

append()方法返回None,讓你無法通過它構建輸出列表結果(你必須先append到列表中,然後將它傳遞如其他答案所示)。試試這個:

def recurse(y, n): 
    if len(y) == n: 
     return y 
    else: 
     return recurse(y + [1], n) 

上述解決方案更符合函數式編程風格。使用append將元素添加到現有列表中 - 這會改變函數參數,通常不是一個好主意。另一方面,y + [1]每次都會創建一個新列表,而不改變參數。函數式編程的支持者會告訴你這是一件好事。

3

y.append Y上就位工作,並返回無

5

list.append()調用列表中的append方法,雖然它修改了該列表,則返回None

所以它不返回列表。

你想要的東西,如:

def recurse(y,n): 
    if len(y) == n: 
     return y 
    else: 
     y.append(1) 
     return recurse(y,n) # explicitly pass the list itself