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

Python自定义TreeNode树结构调用__str__打印时报TypeError求解

报错原因

核心错误来自addchildren方法的错误实现:代码中向children列表追加的是TreeNode.data(即字符串类型的节点值),而非TreeNode节点对象本身。遍历children时拿到的是字符串,字符串内置的__str__方法不接受任何入参,调用时传入level+1就会触发TypeError。
额外存在一个可优化的风险点:__init__方法使用可变列表[]作为默认参数,Python中函数的默认参数在定义时初始化,所有类实例会共享同一个列表对象,可能出现非预期的节点共享问题。

修复后的完整代码
class TreeNode:
    def __init__(self, data, children=None):
        self.data = data
        self.children = children if children is not None else []
    
    def __str__(self, level=0):
        ret = " " * level + str(self.data) + '\n'
        for child in self.children:
           ret += child.__str__(level+1)
        return ret

    # 为树节点添加子节点
    def addchildren(self, node):
        self.children.append(node)

drinks = TreeNode('Drinks')
cold = TreeNode('Cold')
hot = TreeNode('Hot')
cola = TreeNode('Cola')
cappucino = TreeNode('Cappucino')
drinks.addchildren(cold)
drinks.addchildren(hot)
cold.addchildren(cola)
hot.addchildren(cappucino)

print(drinks)

运行后即可输出你期望的缩进树结构:

Drinks
 Cold
  Cola
 Hot
  Cappucino
__str__方法逻辑解释
  • 方法定义的level=0是当前节点的缩进层级参数,默认值0对应根节点,不需要前置缩进。
  • 方法首先生成当前节点的打印行:用" " * level生成对应数量的缩进空格,拼接当前节点的data值和换行符,作为初始返回内容。
  • child.__str__(level+1)为递归调用逻辑:遍历到子节点时,传入level+1作为子节点的缩进层级,保证子节点比父节点多1个单位的缩进,符合树结构的层级展示规则,再把子节点返回的字符串拼接到当前内容后。
  • 最终递归完成后,返回所有层级拼接完成的完整树结构字符串,供print()方法直接输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:45:02