Python函数内部的全局列表突变



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

我已经写了这段代码,我不能得到全局2D列表字符串是如何更新的?这里到底发生了什么?我尝试使用全局关键字也与它里面的palinBreak函数,但它没有帮助!什么时候应该使用全局关键字?

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

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

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

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

最新更新