Python类内调用check方法报NameError未定义(LeetCode整数转罗马数字)
报错根因
你的代码触发NameError: name 'check' is not defined源于两个Python语法层面的问题:
- 类的定义块不属于类内部方法的嵌套作用域,在方法内部直接用裸名引用类内定义的变量、函数时,Python不会自动从类的命名空间查找,会按照LEGB规则从本地、上层嵌套函数、全局、内置作用域依次搜索,找不到就触发报错。
- 类内部通过
def定义的实例方法,必须将第一个参数设为self(代表当前类实例),否则调用时会出现参数个数不匹配的问题。
修正步骤
- 给
check方法补上第一个参数self,将方法内部所有对类属性a的引用替换为self.a,所有递归调用check的位置替换为self.check,确保能正确定位类内的方法和属性。 - 在
intToRoman方法中调用check时,同样通过self.check显式指定调用类内的实例方法,不要直接使用裸名check。
修正后可正常运行的代码
class Solution: a={1:'I',2:'II',3:'III',4:'IV',5:'V',6:'VI',7:'VII',8:'VIII',9:'IX'} def check(self, num, s): if num<=0: return s elif num<10: return self.check(0,s+self.a[num]) elif 10 <= num < 50: if num<=30: return self.check(num%10,s+('X'*(num//10))) else: return self.check(num%10,s+'XL') elif 50 <= num <100: if num<=80: return self.check(num%10,s+('L'+'X'*(num//10))) else: return self.check(num%10,s+'XC') elif 100 <= num <500: if num<=300: return self.check(num%100,s+('C'*(num//100))) else: return self.check(num%100,s+'CD') elif 500 <= num <1000: if num<=800: return self.check(num%100,s+('D'+'C'*(num//100))) else: return self.check(num%100,s+'CM') else: return self.check(num%1000,s+'M'*(num//1000)) def intToRoman(self, num: int) -> str: return self.check(num, "")
补充说明
如果不想使用实例方法的写法,也可以选择两种替代实现:
- 给
check加上@staticmethod装饰器将其定义为静态方法,此时不需要加self参数,但方法内引用属性、调用方法时需要显式指定类名(比如Solution.a、Solution.check),这种写法不如实例方法适配编程题的运行环境友好。 - 直接将
check和a字典移到全局作用域下作为全局变量、全局函数,此时不需要加类前缀也能正常访问,但会污染全局命名空间,不如类内封装的写法规范。
内容的提问来源于stack exchange,提问作者anonymous_frnd
相关产品推荐
相关产品推荐

