2013-08-31 42 views
2

我試圖遞歸調用一個函數,並將部分列表傳遞給該函數。python函數更改列表值

def op3(c,i): 
    d = [] 
    for l in range(0,len(c),+1): 
     d.append(c[l]) 
    a, b = [], [] 
    if len(d)>=3: 
     for l in range(1,len(d)-1,+1): 
      a.append(d[l]) 
     for l in range(2,len(d),+1): 
      b.append(d[l]) 
     A,B = [],[] 
     for j in range(0,len(a),+1): 
      a[j][i] = a[j][i]+a[j][i+1] 
      a[j].pop(i+1) 
      insertf(a,final) 
      A.append(a[j]) 
     op3(A,i+1) 
     for k in range(0,len(b),+1): 
      b[k][i+1] = b[k][i+1]+b[k][i+2] 
      b[k].pop(i+2) 
      insertf(b,final) 
      B.append(b[k]) 
     op3(B,i+1) 

但是,在第一個嵌套'for'循環運行後,原始列表中的值在列表'b'中更改爲d的新值。 我相當新的python。我已經讀過,這只是如何在python中工作。有沒有解決的辦法?

+2

使用不可變的數據結構,就像'tuple'?或'newList = copy.deepcopy(otherList)'創建一個完全獨立的列表? –

+2

如果不是詢問您的解決方案,而是詢問您嘗試使用該功能解決的實際問題,您將收到更多有用的答案。參見[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。 – Bakuriu

回答

1

所有修改的C風格for循環讓我的頭受傷。試圖解析...

def op3(c,i): 
    d = c[:] 
    if len(d)>=3: 
    a=d[1:-1] 
    b=d[2:] 
    #A,B=[],[] 
    for item in a: 
     item[i] += item.pop(i+1) 
     insertf(a,final) # Totally unknown behaviour, does this modify a? 
     #A.append(item) # Seems pointless, A ends up a copy of a, and op3 
     #    # does not modify c (only its items) 
    op3(a,i+1) 
    for item in b: 
     item[i+1] += item.pop(i+2) 
     insertf(b,final) 
    op3(b,i+1) 

所以,從代碼的功能,它期望列表的列表,並修正內部列表。它也會以似乎沒有停止條件的方式遞歸調用自身,但如果內部列表耗盡any((len(ci)<=i+2 for ci in c)),將會中斷。

總的來說,我會說我們不能提供一個好的答案,因爲這段代碼片段並不能表達你想做的事情。這裏的關鍵點似乎是列表不是二維的;每個列表a [j]或b [k]是一個獨立的對象(儘管a[j] is b[j-1]因爲您從同一個列表c中提取它們),並且不瞭解您在a,b,c,d,A,B上執行的操作。

您能否描述一下您所期望的數據結構以及您想要做的處理?這感覺有點像它適合於一種表情的numpy。