You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python递归实现Trie树DFS遍历更新结果数组的运行逻辑疑问

Python递归DFS中列表参数更新逻辑解答

这两个问题的核心本质是Python可变对象的传参机制,具体解释如下:

疑问1:为什么ls能在每轮for循环迭代中更新并传递到下一次迭代?

  • Python的参数传递对可变对象(比如列表、字典、自定义类实例)传递的是对象的内存引用,而非新的拷贝。你最开始调用self.dfs(self.curr, [])时创建的空列表,在所有递归调用中都是同一个对象,所有操作都是直接修改该对象本身。
  • 你原代码中ls = self.dfs(level.child[c], ls)以及函数末尾的return ls,本质上是把同一个列表的引用反复赋值给当前作用域的ls变量。因为每次dfs返回的就是你传入的那个ls本身,所以赋值操作并没有改变ls的指向,下一轮for循环迭代时,ls依然指向全局唯一的结果列表,自然携带了之前所有迭代和递归的修改结果。

疑问2:为什么去掉return和赋值操作后代码依然正常运行?

  • 你提到的修改版代码,去掉了ls赋值和return操作依然能生效,才是符合Python可变对象特性的正常表现:你在递归函数中执行ls.append(level.info)是对列表的原地修改,直接作用于最开始创建的全局结果列表,不需要通过返回值来回传修改结果。
  • 举个简单的示例验证:
def add_item(lst):
    lst.append(1)
    # 不需要return lst

my_lst = []
add_item(my_lst)
print(my_lst) # 输出 [1]
  • 你原代码中的return操作和ls赋值其实是完全冗余的,只是刚好没有影响结果而已,本质上所有修改都是通过可变对象的原地操作完成的。

补充建议

如果想要避免这种隐式的原地修改,你可以每次递归传入新的列表拷贝,但这种写法会增加内存开销,对于收集结果的DFS场景,直接用可变对象原地修改是更常用的高效写法。


内容的提问来源于stack exchange,提问作者Qiang Super

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:24:00