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

Python类中check_balance方法调用报NameError错误求助

问题排查与修复

你的代码里有两个关键问题导致了NameError:

1. 类方法定义与递归调用路径错误

类的实例方法必须以self作为第一个参数(你用t也可,但惯例是self),且内部递归调用时,必须通过类或实例引用该方法,不能直接写函数名——直接写会被解释器当成全局函数查找,自然找不到。

原方法定义:

def check_balance(t):
    if t.isLeaf() or t.isEmpty():
        return True
    if t.getLc().isEmpty() or t.getRc().isEmpty():
        return False
    return check_balance(t.getLc()) and check_balance(t.getRc())

修复后(统一用self作为实例参数,递归时通过self调用方法):

def check_balance(self):
    if self.isLeaf() or self.isEmpty():
        return True
    if self.getLc().isEmpty() or self.getRc().isEmpty():
        return False
    return self.check_balance(self.getLc()) and self.check_balance(self.getRc())

2. 方法调用方式错误

你直接写check_balance(a),这是在全局作用域找函数,但check_balance是tree类的成员方法,必须通过实例调用:

print(a.check_balance())

完整修复后的代码

class tree():
    def __init__(self,a=None,lc=None,rc=None):
        self.label=a
        self.lt=lc
        self.rt=rc
        if a is not None:
            if lc is None:
                self.lt=tree()
            if rc is None:
                self.rt=tree()

    def getLabel(self):
        return self.label

    def isEmpty(self):
        return self.label is None

    def isLeaf(self):
        return (self.lt.isEmpty() and self.rt.isEmpty())

    def getLc(self):
        return self.lt

    def getRc(self):
        return self.rt
    
    def check_balance(self):
        if self.isLeaf() or self.isEmpty():
            return True
        if self.getLc().isEmpty() or self.getRc().isEmpty():
            return False
        return self.check_balance(self.getLc()) and self.check_balance(self.getRc())

a = tree(1, tree(2, tree(7), tree(8)), tree(3, tree(7), tree()))
print(a.check_balance())

可选:用类方法实现

如果想保留“传实例调用”的方式,可给方法加@classmethod装饰器,定义如下:

@classmethod
def check_balance(cls, t):
    if t.isLeaf() or t.isEmpty():
        return True
    if t.getLc().isEmpty() or t.getRc().isEmpty():
        return False
    return cls.check_balance(t.getLc()) and cls.check_balance(t.getRc())

此时调用方式为print(tree.check_balance(a)),同样能解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:01:06