Запутывает список передачи в функции рекурсии python

class Solution(object):
def combinationSum2(self, candidates, target):
    """
    :type candidates: List[int]
    :type target: int
    :rtype: List[List[int]]
    """
    candidates.sort()
    res = []  # save the result
    path = []  # save each unique combination
    self.dfs(0, target, path, res, candidates)
    return res

def dfs(self, start_index, target, path, res, candidates):
    if target == 0:
        res.append(path)
        return
    if target < 0:
        path.pop()
        return
    for i in range(start_index, len(candidates)):
        if i > start_index and candidates[i] == candidates[i-1]:
            continue
        path += [candidates[i]]
        self.dfs(i+1, target-candidates[i], path, res, candidates)
        if path:
            path.pop()

Приведенный выше код для проблемы LeetCode Комбинированная сумма II, учитывая входные [10,1,2,7,6,1,5] и 8, выход должен быть [[1,1,6],[1,2,5],[1,7],[2,6]]. Однако вывод этого фрагмента кода - [[],[],[],[]], я очень сбиваю с толку и задаюсь вопросом, почему :(

Измените res.append(path) на res.append(path.copy())

Aran-Fey 11.04.2018 13:34

Возможный дубликат Как клонировать или скопировать список?

Aran-Fey 11.04.2018 13:34

@ Aran-Fey, согласно другим сообщениям, все, что передается на функцию в python, называется «вызовом по объектной ссылке», я знаю неглубокую копию объявления с глубокой копией python, просто интересно, что в моем случае, почему path переходит к функция обратного отслеживания не рассматривается как ссылка?

xman 11.04.2018 13:42

является рассматривается как ссылка. Вот почему, когда вы вызываете path.pop(), вы уничтожаете свой собственный вывод, и в итоге все, что у вас есть, - это список пустых списков. Вы хотите добавить к результату значение Текущийpath, поэтому вам нужно сделать его копию, чтобы предотвратить его влияние на последующие операции pop().

Aran-Fey 11.04.2018 13:45

@ Аран-Фей А ... да! Спасибо!

xman 11.04.2018 13:50
0
5
142
0

Другие вопросы по теме