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

