2016-11-16 51 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