为什么Python普通函数可调用未定义函数,类中方法调用后续定义方法会报错?
问题原因解析
核心差异来自Python的名字查找规则,以及普通函数、类方法的作用域差异:
1. 普通函数能正常运行的原因
Python的普通函数执行时,名字查找遵循LEGB规则:
- 先找当前函数的本地作用域(L)
- 再找外层嵌套函数的作用域(E)
- 再找全局作用域(G)
- 最后找Python内置作用域(B)
同时,函数定义阶段只会做语法校验,不会实际校验被调用的函数是否存在,只有函数被执行的时候才会触发名字查找。
第一段代码里,调用funct_a()的时候,funct_b已经在全局作用域定义完成,所以查找全局作用域时能找到对应函数,正常运行。
2. 类方法报错的原因
类的方法内部默认不会把类的其他方法/属性加入到作用域查找链里,你直接写funct_b()的时候,Python还是按照LEGB规则查找:
- 当前
funct_a方法的本地作用域没有funct_b - 没有外层嵌套作用域
- 全局作用域也没有定义名为
funct_b的全局函数 - 内置作用域也没有对应名字,直接触发
NameError
类的方法是绑定在实例/类对象上的,必须显式通过实例(self)或者类名访问才能找到,把报错行改成self.funct_b()就能正常运行。
内容的提问来源于stack exchange,提问作者Danish Mashkoor
相关产品推荐
相关产品推荐

