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

Python函数运行原理及定义顺序与调用生效关系问题咨询

Python函数调用的规则本质

你之前对「函数调用必须放在定义之后」的认知存在一点偏差:Python并不会在函数定义阶段检查内部调用的函数是否存在,只会在函数实际被执行时才会去作用域查找对应的函数。

你给出的第二段代码的运行流程

解释器执行代码时是从上到下逐行处理的,对应代码的运行逻辑如下:

  1. 首先读到print_num的函数定义语句:只会将print_num注册到当前全局作用域,函数内部的print(num1)、main()代码只会被编译成字节码暂存,不会立刻执行,因此此时哪怕main还没定义也不会触发报错。
  2. 接着往下读到main的函数定义语句:同理将main注册到全局作用域,内部代码同样不会立刻执行。
  3. 最后执行最末尾的main()调用:此时print_num和main都已经完成定义存入作用域
    • 执行main内部逻辑:读取输入后调用print_num,能正常找到print_num函数
    • 执行print_num内部逻辑:打印数值后调用main,也能正常找到已经定义完成的main函数,所以调用可以正常生效。

注意:你给出的这段代码属于无限递归调用,运行后会反复要求输入数字,直到触发Python默认的递归深度限制抛出报错为止。

什么时候会出现「调用在定义之前报错」?

只有当你在目标函数完成定义之前,实际触发了包含该调用的函数执行,才会抛出NameError,示例如下:

def print_num(num1):
    print(num1)
    main()

# 此时main还没定义,就触发print_num执行,就会报main未定义的错误
print_num(10)

def main():
    num1 = int(input("Please enter first number: "))
    print_num(num1)

内容的提问来源于stack exchange,提问作者Daniel l

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 06:24:03