递归附加到列表的问题

时间:2018-10-10 19:24:04

标签: python list recursion

我的代码:

matrix = []
dynamicmatrix = []
answers = []

...some other code...

def search(chartofind, row):
    global dynamicmatrix

    print("SEARCHING", chartofind, row)

    if row == numberofrows:
        toadd = dynamicmatrix.copy()
        answers.append(toadd)
        return


    for col in range(0, numberofrows):
        if canPlace(chartofind, row, col) == False and matrix[row][col] != chartofind:
            continue
        if matrix[row][col] == chartofind:
            search(chartofind, row+1)
        else:
            dynamicmatrix[row][col] = chartofind
            search(chartofind, row+1)
            dynamicmatrix[row][col] = matrix[row][col]

search("A", 0)        
for i in answers:
    print(i)

问题是,当我在递归中打印要添加时,就可以了。但是,在遍历列表之后,将其追加到该列表之后; 答案,它显示的值与我将其附加到列表时显示的值不同。递归中的值是正确的,但是递归后整个列表 answers 被破坏了。是什么原因造成的?这让我发疯,任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

原因是.copy()提取了dynamicmatrix的浅表副本,这意味着副本中也引用了矩阵中的嵌套列表,以及您对这些嵌套列表进行的任何后续更改也会影响复制。

例如,以下分配将影响您已经附加到answer的内容:

dynamicmatrix[row][col] = chartofind

解决方案:

使用deepcopy

import copy
toadd = copy.deepcopy(dynamicmatrix)

或使用列表推导明确地制作更深的副本:

toadd = [row[:] for row in dynamicmatrix]