Python递归更新数组



我可以问一个关于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)

不返回CCD_ 3。我不知道为什么这样有效?

提前感谢您的帮助。

最佳,

天真的Python学习者

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

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

Python常见问题解答中甚至有一个与此相关的答案。下面有一些进一步的阅读和例子。

如果你想让你的代码按照你想象的方式运行,你可以构造一个新的list,而不是编辑单个的list。这样做有一些原因,但对于普通的list来说,它相当昂贵,而且几乎没有价值。要查看它的作用,请将append调用更改为:

ls = ls + [level.info]

最新更新