首页 > 解决方案 > 递归附加到列表的问题

问题描述

我的代码:

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)

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

标签: pythonlistrecursion

解决方案


原因是它.copy()需要 的​​浅拷贝dynamicmatrix,这意味着矩阵中的嵌套列表也在副本中被引用,并且您对这些嵌套列表所做的任何后续更改也会影响副本。

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

dynamicmatrix[row][col] = chartofind

解决方案:

使用deepcopy

import copy
toadd = copy.deepcopy(dynamicmatrix)

或者使用列表推导显式地制作更深的副本:

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

推荐阅读