2016-11-16 44 views
-2

我正在研究這個問題的回溯解決方案 - 「給定一個字符串s,使得分區的每個子字符串都是迴文。Python中函數內部的全局列表變異

我寫了這段代碼,我無法得到全局2D列表字符串如何得到更新?這裏究竟發生了什麼?我在palinBreak函數裏也嘗試過使用global關鍵字,但它並沒有幫助! 什麼時候應該使用全局關鍵字?

觀察:全局列表字符串的每個元素變爲本地列表變量arr。例如,strings = [x,y]和arr = [z],則字符串變爲[z,z,z];而我希望它是[x,y,z]。爲什麼會發生?

編輯:添加預期的輸出與我得到的輸出(注意從第3行開始)。

預期成果是:

ans is ['a', 'b', 'a', 'a', 'b'] [] 
strings is [['a', 'b', 'a', 'a', 'b']] 
ans is ['a', 'b', 'aa', 'b'] [['a', 'b', 'a', 'a', 'b']] 
strings is [['a', 'b', 'a', 'a', 'b'], ['a', 'b', 'aa', 'b']] 
ans is ['a', 'baab'] [['a', 'b', 'a', 'a', 'b'], ['a', 'b', 'aa', 'b']] 
strings is [['a', 'b', 'a', 'a', 'b'], ['a', 'b', 'aa', 'b'], ['a', 'baab']] 
ans is ['aba', 'a', 'b'] [['a', 'b', 'a', 'a', 'b'], ['a', 'b', 'aa', 'b'], ['a', 'baab']] 
strings is [['a', 'b', 'a', 'a', 'b'], ['a', 'b', 'aa', 'b'], ['a', 'baab'], ['aba', 'a', 'b']] 
[['a', 'b', 'a', 'a', 'b'], ['a', 'b', 'aa', 'b'], ['a', 'baab'], ['aba', 'a', 'b']] 

輸出:

ans is ['a', 'b', 'a', 'a', 'b'] [] 
strings is [['a', 'b', 'a', 'a', 'b']] 
ans is ['a', 'b', 'aa', 'b'] [['a', 'b', 'aa', 'b']] 
strings is [['a', 'b', 'aa', 'b'], ['a', 'b', 'aa', 'b']] 
ans is ['a', 'baab'] [['a', 'baab'], ['a', 'baab']] 
strings is [['a', 'baab'], ['a', 'baab'], ['a', 'baab']] 
ans is ['aba', 'a', 'b'] [['aba', 'a', 'b'], ['aba', 'a', 'b'], ['aba', 'a', 'b']] 
strings is [['aba', 'a', 'b'], ['aba', 'a', 'b'], ['aba', 'a', 'b'], ['aba', 'a', 'b']] 
[[], [], [], []] 
>>> 

代碼:

def isPalin(s): 
    i = 0 
    j = len(s)-1 
    while(i<j): 
     if(s[i]!=s[j]): 
      return False 
     i+=1 
     j-=1 
    return True 

def palinBreak(s, start, arr): 
    #print "Called", start, arr 
    #global strings 
    if(start==len(s)): 
     print "ans is", arr, strings 
     strings.append(arr) 
     print "strings is", strings 
     return 0 

    flag = -1 
    for i in range(1, len(s)-start+1): 
     curr = s[start : start+i] 
     #print "Testing curr and start and i", curr, start, i 
     if(isPalin(curr)): 
      arr.append(curr) 
      #print arr, start, i 
      #print "Next call from", start+i 
      pb = palinBreak(s, start+i, arr) 
      if(pb != -1): 
       flag = 1 
      arr.pop() 
      #print "popped l", arr 
    return flag 

strings = [] 
palinBreak("abaab", 0, []) 
print strings 
+2

爲什麼不會是更新?你在'palinBreak'裏專門做了這個。 –

+0

您的預期產出是多少? – Billy

+0

我也添加了這些信息,請看看! – devautor

回答

1

的問題是,ARR將在內部遞歸調用同一個列表。 嘗試更換

 pb = palinBreak(s, start+i, arr) 

 pb = palinBreak(s, start+i, list(arr)) 
+0

輸出是:ans是['a','b','a','a','b'] ['a','b','a','a','b'] 字符串是['a','b','a','a','b',[]] ans是['a','b','a','aa','b ''''''','b','a','aa','b'] 字符串是['a','b','a','aa','b',[.. 。]] ans is ['a','b','a','baab'] ['a','b','a','baab'] 字符串是['a','b '','a','baab',[...] ans是['a','b','a','aba','a','b'] ['a',' b','a','aba','a','b'] ['a','b','a' 。]] ['a','b','a','aba'] – devautor

+0

哦,我想我明白你的意思了。我糾正了我的答案。 – quantummind

相關問題