在 python 中递归传递列表是如何工作的?

How does passing lists recursively in python work?

提问人:JayaAnim 提问时间:3/16/2023 更新时间:3/16/2023 访问量:48

问:

我正在尝试更好地理解在 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-3.x 列表 递归 可变

评论

2赞 Tim Roberts 3/16/2023
它不会导致争用,因为代码是串行执行的。一次只有一个函数会触及列表。在这种情况下,是此函数每次调用中完全相同的列表对象。正在创建结果中列表的副本。如果不进行复制,则仅包含对原始列表对象的多个引用,并且当所有内容展开时,该对象将为空。curres.append(cur.copy())res

答: 暂无答案