Python 的执行流程应该是 先编译(解析函数定义),再逐行执行
Python 代码的执行分为两个阶段:
编译阶段(解析代码结构)
执行阶段(逐行运行字节码)
(1) 编译阶段
当 Python 解释器遇到 def 语句时:
创建函数对象,并绑定到函数名(如 f 或 g)。
存储函数体的代码(但不会立即执行)。
确定函数的作用域(即函数定义时的环境)。
python
def f(): # 编译阶段:创建函数对象 f,存储代码块 print(x)
print(x)
此时 f 已经是一个函数对象,但 print(x) 不会立即运行。
(2) 执行阶段
当调用函数(如 f())时:
执行函数体的代码。
按照 LEGB 规则 查找变量(如 x)。
赋值给变量:my_func = f
作为参数传递:call_func(f)
存储在数据结构中:funcs = [f, g]
函数对象存储的信息:
代码(code 属性)
作用域(globals 和 closure)
默认参数(defaults)
g 在定义时绑定全局 x:
g 定义在全局作用域,因此它的自由变量 x 固定指向全局 x(即 x = 1)。
即使 g 在 f 内部被调用,也不会访问 f 的局部 x = 3。
函数作用域是静态的(词法作用域):
Python 的作用域规则由 定义位置 决定,而非调用位置。