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

为什么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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:39:02