Python中函数内的全局列表变异

时间:2016-11-16 14:43:50

标签: python

我正在研究这个问题的回溯解决方案 - “给定一个字符串s,分区s使得分区的每个子字符串都是回文。”

我已经编写了这段代码,我无法获得全局2D列表字符串如何更新?这里究竟发生了什么?我尝试在palinBreak函数中使用全局关键字,但它没有帮助! 何时应使用全局关键字?

观察:全局列表字符串的每个元素都更改为本地列表变量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

1 个答案:

答案 0 :(得分:1)

问题是arr将是内部递归调用中的相同列表。 尝试替换

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

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