提问人:JayaAnim 提问时间:3/16/2023 更新时间:3/16/2023 访问量:48
在 python 中递归传递列表是如何工作的?
How does passing lists recursively in python work?
问:
我正在尝试更好地理解在 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”列表会导致数百个相同函数影响同一列表的竞争条件。我认为会发生这种情况,因为尽管函数在堆栈上的新内存块中被调用,但列表是一个可变对象,因此将其作为参数传递意味着每个递归调用都指向列表的相同内存位置。然而,这根本不是正在发生的事情。
答: 暂无答案
评论
cur
res.append(cur.copy())
res