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

Python二叉树递归遍历返回列表与字符串行为差异问题咨询

问题解答:Python递归中列表与字符串操作的行为差异

核心原因:Python可变对象与不可变对象的传递逻辑差异

  • 列表是可变对象:当你将列表作为参数传入函数时,传递的是列表的内存引用,append()操作会直接修改原列表对象本身,所有递归层级操作的都是同一个列表实例,因此不需要接收递归返回值,修改也能在全局生效。

额外注意:你这里使用traversal=[]作为默认参数是有风险的,Python的函数默认参数会在函数定义时初始化,而非每次调用时初始化,多次调用这个inorder方法会共享同一个列表,导致结果累加出错,建议改成traversal=None,函数内部判断如果是None就初始化为空列表。

  • 字符串是不可变对象:所有对字符串的修改操作(比如+=拼接)都会生成一个全新的字符串对象,不会修改原字符串。你没有接收递归返回值时,下层递归中拼接的新字符串只会在下层作用域生效,上层的traversal还是原来的旧值,所以最后只有根节点的1被拼接进去,结果就只有'1'。

修改后代码正确的原因

你将递归调用的返回值赋值给当前层的traversal变量时,相当于把下层递归拼接完成的新字符串拿到了当前作用域,再拼接当前节点的值,之后再传递给右子树递归,最终就能得到完整的拼接结果。

简单验证示例

# 可变对象传参效果
def modify_list(lst):
    lst.append(1)

my_list = []
modify_list(my_list)
print(my_list) # 输出 [1],修改直接作用于原对象

# 不可变对象传参效果
def modify_str(s):
    s += "1"

my_str = ""
modify_str(my_str)
print(my_str) # 输出 空字符串,修改的是函数内部新生成的对象,原对象无变化

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:48:02