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

Python函数默认参数求值时机与代码执行校验顺序疑问

Python代码执行逻辑与编译阶段差异解答

示例代码与运行结果

你给出的代码如下:

i = 5

def f(arg=i):
    print(arg)
    print(i)

i = 6
f()

运行输出:

5
6


示例代码的执行逻辑

代码执行可以拆分为以下步骤:

  • 解释器先完成全量代码语法检查、编译为字节码后,才会从上到下执行顶层代码:
    1. 执行i = 5,全局作用域的变量i被赋值为5
    2. 处理def f函数定义:
      • 函数默认参数会在定义阶段完成计算,而非调用阶段,因此arg=i会直接取当前的全局i值5,作为arg的默认值绑定到函数对象上
      • 函数体内部的代码此时仅会被保存为字节码,不会实际执行
    3. 执行i = 6,全局作用域的变量i被修改为6
    4. 调用f():无传入参数,使用默认值arg=5,所以第一个print(arg)输出5;第二个print(i)会读取当前全局作用域的i值,得到6完成输出

函数定义与执行的阶段差异

你提到的「函数体内部代码要等到调用时才执行」的逻辑是运行阶段的规则,但要注意Python处理代码分两个完全独立的阶段:

  • 「编译阶段」:加载.py文件时,解释器会扫描整个文件的所有代码(包括函数体内部),做全量语法检查、编译为字节码。只要任意位置存在语法错误(比如括号不匹配、关键字用错),会直接抛出语法错误,根本不会进入后续的代码运行环节
  • 「运行阶段」:编译完全通过后,才会从上到下执行顶层代码,此时函数体的字节码只会在函数被调用时才执行

语法错误优先抛出的原因

语法错误属于编译阶段的错误,优先级远高于运行阶段的错误:哪怕你调用前的代码有运行时错误(比如除零、变量未定义),只要函数内部存在语法错误,解释器会在最开始的编译阶段就发现并抛出错误,不会进入运行阶段,自然也不会触碰到调用前的运行时错误。
这个逻辑和示例代码的执行逻辑完全无关:示例代码的运行是编译通过后的运行时行为,语法错误是编译阶段就会拦截的前置检查,两者分属不同处理阶段。


内容的提问来源于stack exchange,提问作者Ahmad Al Ghoroury

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:18:02