Проблемы с добавлением в список в рекурсии - PullRequest
0 голосов
/ 10 октября 2018

Мой код:

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 в рекурсии, это нормально.Однако после просмотра списка он был добавлен; ответы , оно показывает значение, отличное от того, которое было показано при добавлении его в список.Значение внутри рекурсии было правильным, но после рекурсии весь список ответов разрушен.Что может быть причиной этого?Это сводит меня с ума, любая помощь будет оценена.

1 Ответ

0 голосов
/ 10 октября 2018

Причина в том, что .copy() принимает поверхностную копию dynamicmatrix, что означает, что на вложенные списки в матрице также ссылаются в копии, и любое последующее изменение этих вложенных списков повлияет на копиютакже.

Например, следующее назначение повлияет на то, что вы уже добавили к answer:

dynamicmatrix[row][col] = chartofind

Решение:

Использование deepcopy:

import copy
toadd = copy.deepcopy(dynamicmatrix)

Или используйте списочное понимание, чтобы сделать более глубокую копию явно:

toadd = [row[:] for row in dynamicmatrix]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...