Python函数运行原理及定义顺序与调用生效关系问题咨询
Python函数调用的规则本质
你之前对「函数调用必须放在定义之后」的认知存在一点偏差:Python并不会在函数定义阶段检查内部调用的函数是否存在,只会在函数实际被执行时才会去作用域查找对应的函数。
你给出的第二段代码的运行流程
解释器执行代码时是从上到下逐行处理的,对应代码的运行逻辑如下:
- 首先读到
print_num的函数定义语句:只会将print_num注册到当前全局作用域,函数内部的print(num1)、main()代码只会被编译成字节码暂存,不会立刻执行,因此此时哪怕main还没定义也不会触发报错。 - 接着往下读到
main的函数定义语句:同理将main注册到全局作用域,内部代码同样不会立刻执行。 - 最后执行最末尾的
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
相关产品推荐
相关产品推荐

