首页 新闻 会员 周边 捐助

解析函数难道是创建函数对象吗

0
[已解决问题] 解决于 2025-08-08 11:10

Python 的执行流程应该是 先编译(解析函数定义),再逐行执行

_java_python的主页 _java_python | 小虾三级 | 园豆:738
提问于:2025-08-08 11:07
< >
分享
最佳答案
0

Python 代码的执行分为两个阶段:

编译阶段(解析代码结构)

执行阶段(逐行运行字节码)

(1) 编译阶段
当 Python 解释器遇到 def 语句时:

创建函数对象,并绑定到函数名(如 f 或 g)。

存储函数体的代码(但不会立即执行)。

确定函数的作用域(即函数定义时的环境)。

python
def f(): # 编译阶段:创建函数对象 f,存储代码块 print(x)
print(x)
此时 f 已经是一个函数对象,但 print(x) 不会立即运行。

(2) 执行阶段
当调用函数(如 f())时:

执行函数体的代码。

按照 LEGB 规则 查找变量(如 x)。

  1. 函数对象的本质
    函数是“一等对象”(First-Class Object),可以:

赋值给变量:my_func = f

作为参数传递:call_func(f)

存储在数据结构中:funcs = [f, g]

函数对象存储的信息:

代码(code 属性)

作用域(globalsclosure

默认参数(defaults

g 在定义时绑定全局 x:

g 定义在全局作用域,因此它的自由变量 x 固定指向全局 x(即 x = 1)。

即使 g 在 f 内部被调用,也不会访问 f 的局部 x = 3。

函数作用域是静态的(词法作用域):

Python 的作用域规则由 定义位置 决定,而非调用位置。

_java_python | 小虾三级 |园豆:738 | 2025-08-08 11:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册