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
相关产品推荐
相关产品推荐

