python - Python递归更新数组
问题描述
我可以问一个关于 Python 递归的问题吗?我想检查一下这背后的逻辑,为什么它能够不断更新结果?
问题:构造一个 DFS 递归以附加满足指定条件的所有子节点,例如,如果节点的结束指示符为 True,我们将把该节点添加到数组中。此递归将用于另一个函数。
- 我的代码:
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
。这称为通过引用传递。
类似地,当代码分配 to 的输出时dfs
,ls
这实际上是用指向list
对象的指针替换指向对象的指针list
,即它什么也不做。
Python FAQ中甚至有一个与此相关的答案。在这个答案中有一些进一步的阅读示例。
如果你想让你的代码按照你想象的方式运行,你可以构造一个 newlist
而不是编辑单个list
. 这样做有一些原因,但在正常情况list
下,它相当昂贵且价值不大。要查看它的实际效果,请将append
调用更改为:
ls = ls + [level.info]
推荐阅读
- angular - 有没有办法跳过 Angular 中的单元测试套件?
- c# - 在 Designtime 中使用 PictureBox 作为父级,为什么不可能?
- c# - Visual Studio 无法识别带有 .js 扩展名的 React 文件
- powershell - Powershell Format-Hex 不显示行尾。为什么?
- ruby - 如何找到连续的主题标签
- c# - 如何提高我的阅读电子邮件 c# web app 速度
- reactjs - 捆绑时未定义 React
- java - Eclipse 在处理复制/粘贴或键入时过于滞后
- javascript - 从 MySQL 检索数据到 JS 变量
- acumatica - Acumatica 税务类别 REST API