Python 递归更新一个数组

Python recursion updates an array

我可以问一个关于 Python 递归的问题吗?我想看看这背后的逻辑,以及为什么它能够不断更新结果?

问题: DFS 递归被构造为追加满足指定条件的所有子节点,例如,如果节点的结束指示符为 True,我们将把该节点添加到数组中。此递归将在另一个函数中使用。

  1. 我的代码:
    def dfs(self, level, ls):
        # if we meet the end of a level, this level’s information will be added to the returned list
        if level.end:
            ls.append(level.info)
        # go further to explore this level’s children, even an end is met. 
        for c in level.child:
            ls = self.dfs(level.child[c], ls)
        return ls

DFS 将由以下人员调用:

ls = self.dfs(self.curr, [])

关卡为自定义Trie:

class Trie:
    def __init__(self):
        self.child = collections.defaultdict(Trie)
        # self.child = {}
        self.end = False 
        self.w = ''
        self.f = 0

我不确定为什么这个 ls 会在每次 for 循环迭代中得到更新,然后传递到下一次迭代。我也很惊讶,以下代码也有效:

        for c in level.child:
            self.dfs(level.child[c], ls)

不返回ls。我不确定为什么会这样?

在此先感谢您的帮助。

最佳,

天真Python学习者

当列表传递到 dfs 时,传递的不是 list 中的当前值,而是对 list 中的引用(指针)记忆。只有一个list。这称为按引用传递。

类似地,当代码将 dfs 的输出分配给 ls 时,这实际上是用指向 list 的指针替换指向 list 对象的指针对象,即它什么都不做。

Python FAQ. There’s some further reading with examples in this answer.

中甚至有与此相关的答案

如果你想让你的代码按照你想象的方式运行,你可以构建一个新的 list 而不是编辑单个 list。这样做有一些原因,但是对于普通的 list 它相当昂贵并且提供的价值很小。要查看实际效果,请将 append 调用更改为:

    ls = ls + [level.info]