如何在 python 中递归传递列表?

问题描述 投票:0回答:0

我试图更好地理解在 python 中传递列表是如何工作的。我对 C++ 有很强的理解,所以当我自学 python 时,我的理解是传递列表就像将指针变量传递给为该列表分配的内存。但是,递归传递列表对我来说越来越棘手。例如在下面的这段代码中,我不明白名为“cur”的列表是如何不创建竞争条件的:

def dfs(index, cur, total):
    if total == target:
        res.append(cur.copy())
        return
    if index >= len(candidates) or total > target:
        return
    
    cur.append(candidates[index])
    dfs(index, cur, total + candidates[index])
    cur.pop()
    dfs(index + 1, cur, total)

让我更困惑的是,在遇到基本情况时需要创建一个深层副本。如果我从列表中弹出并且它不影响其他递归调用,为什么此时需要深度复制?它不是已经表现得像一个深拷贝了吗?

我的理解是,在提供的代码中递归弹出和附加“cur”列表会导致竞争条件,其中数百个相同的函数正在影响相同的列表。我认为这会发生,因为尽管函数在堆栈上的新内存块中被调用,但列表是一个可变对象,因此将它作为参数传递意味着每个递归调用都指向列表的相同内存位置。然而,这根本不是正在发生的事情。

python python-3.x list recursion mutable
© www.soinside.com 2019 - 2024. All rights reserved.