网易首页 > 网易号 > 正文 申请入驻

Python:函数对象

0
分享至

在 Python 中,函数对象(function object)并不是语法层面的子程序,而是在运行时创建的一种对象。与其他对象一样,它可以被绑定、传递和存储;不同之处在于,函数对象用于承载一次函数调用所需的全部声明性信息。函数对象本身并不执行代码,也不保存运行期状态,而是将一段可执行逻辑与其所需的外部环境固定下来,并在被调用时触发一次新的执行过程。

理解函数对象在 Python 中所承担的这一角色,是理解函数调用、闭包、默认参数以及高阶函数等机制的基础。

一、函数对象的创建过程

在 Python 中,def 语句的作用并不是“声明一个静态函数”,而是在运行时创建一个函数对象(function object),并将其绑定到一个名称上。

当解释器执行如下代码时:

其内部过程可以概括为以下几个阶段。

(1)编译函数体,生成代码对象

在模块加载或类体执行阶段,解释器会先将函数体编译为一个字节码的。

代码对象是不可变的,它描述了函数的指令序列、局部变量布局、编译阶段嵌入的字面量值对象等信息,但并不包含执行环境。

需要注意的是,代码对象并不是函数本身,而只是函数“可执行逻辑”的静态表示。

(2)创建函数对象

当 def 语句被执行时,解释器会基于:

• 代码对象

• 当前作用域中的全局命名空间

• 默认参数

• 闭包信息(如有)

创建一个新的函数对象

该函数对象持有:

• 对代码对象的引用

• 对全局命名空间的引用

• 对默认参数与闭包变量等的引用

(3)名称绑定

最终生成的函数对象被绑定到当前作用域中的名字 greet:

greet → 
      

至此,函数对象的创建过程完成。

由此可见,函数并非定义时即存在的静态实体,而是 def 语句执行的运行时结果。

二、函数对象内部的核心绑定关系

在对象模型中,函数对象承担的是一种执行协议封装者的角色,其核心职责包括:

• 关联一段代码对象(__code__)

• 绑定全局命名空间(__globals__)

• 绑定默认参数(__defaults__ / __kwdefaults__)

• 绑定闭包变量(__closure__,如有)

函数对象本身不保存执行期状态,也不承载指令执行过程。它的职责在于规定一次函数调用应当如何创建相应的执行上下文。

1、执行结构来源

__code__ 指向一个代码对象,用于描述函数体的执行结构。

f.__code__

函数对象并不修改代码对象,也无法改变其结构,它只是引用这一结构。

2、名称解析的外部环境

函数对象会绑定其定义时所在的全局命名空间 __globals__:

f.__globals__

这决定了:

• 函数体中全局变量的解析位置

• 内置名称的查找路径

这一绑定在函数创建时完成,而不是在调用时动态决定。

3、默认参数的早绑定特性

默认参数在函数对象创建时即被绑定:

    

这里的 y 并不是“每次调用重新生成”,而是函数对象持有的一个默认值引用。

这再次说明,函数对象并不是语法层面的声明,而是调用行为得以成立的对象化前提。

4、闭包的入口

当函数引用了外层作用域中的变量时,函数对象会持有一个 __closure__:

• 每个元素是一个

• cell 对象中保存的是跨帧共享的绑定

函数对象并不保存变量值本身,而是保存对 cell 的引用。

三、函数对象的对象模型定位

1、一致的基本定位

从对象模型的角度看,函数对象与其他对象并无本质差异。

函数对象同样具备:

身份(identity):运行期间唯一的对象标识

类型(type):function

(value):由代码对象、全局命名空间、默认参数、闭包引用等内部绑定状态共同构成

print(type(f))                 #

这意味着:

• 函数可以被绑定到名称

• 函数可以作为参数传递

• 函数可以作为返回值

• 函数可以在运行时被修改或包装

2、与相关对象的关系

在 Python 中,一次函数调用至少涉及三类对象:

• 代码对象:描述“执行结构”,被函数对象持有

• 函数对象:提供“可调用语义”,触发帧对象创建

• 帧对象:承载“运行期状态”,引用代码对象执行

函数对象并不是代码对象的别名,而是对某段代码在特定执行环境下可被调用这一语义的对象化表达。

同一个代码对象,理论上可以被多个函数对象持有:

)

这里的 f 与 g,拥有同一个代码对象,但可以绑定不同的全局命名空间、默认参数或闭包。这说明:

函数对象并不等同于“那段代码”,而是一次“可调用声明”

当我们调用一个函数时:

f(10)

函数对象本身并不会执行任何字节码。它所做的,仅是:

(1)根据自身绑定的信息,创建一个新的帧对象

(2)将代码对象与执行环境交给帧对象

(3)将控制权交给解释器的执行循环

也就是说,函数对象是调用的触发者,而不是执行的承载者。

真正执行字节码的,是。

3、为什么会如此设计

如果函数对象本身保存执行状态,将直接破坏以下基本能力:

• 多次调用的独立性

• 递归调用的正确性

• 高阶函数的可组合性

通过将职责拆分为:

• 函数对象:声明调用规则

• 帧对象:承载运行状态

Python 才能保证:

• 同一个函数对象可以被安全地反复调用

• 每一次调用都有独立的执行上下文

四、函数对象的应用场景

Python 中的函数是典型的一等对象,这一特性是许多高级机制的基础。

1、作为参数传递

print(apply(square, 5))  # 25

此处,square 并未被调用,而是作为普通对象传递。

2、作为返回值

print(add10(5))  # 15

这里返回的并非“代码片段”,而是一个完整的函数对象。

3、存储于数据结构中

print(operations[0](-10))  # 10

函数对象可以与其他对象并列存在于容器中,完全遵循对象的一般使用规则。

4、函数对象在闭包机制中的角色

考虑如下示例:

    return inner

在这一结构中:

• outer 的代码对象声明 x 为 cellvar

• inner 的代码对象声明 x 为 freevar

函数对象在其中承担的职责是:在创建 inner 时,将 outer 帧中的 cell 对象绑定到 inner.__closure__。

也就是说,函数对象是闭包结构在对象模型中的“连接器”。

它并不捕获变量值,也不维护生命周期,只是将词法结构声明与运行期对象进行连接。

小结

在 Python 的对象模型中,函数对象是可调用语义的封装者,而非执行本身。它将代码对象所描述的执行结构,与全局环境、默认参数及闭包引用稳定绑定,并在调用时触发帧对象的创建。通过将执行结构、执行入口与运行状态严格分层,Python 实现了函数调用、闭包与递归语义的一致性与可组合性。


点赞有美意,赞赏是鼓励

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
乌克兰高兴早了,俄军中将抢救成功:不到48小时,阿联酋抓住杀手

乌克兰高兴早了,俄军中将抢救成功:不到48小时,阿联酋抓住杀手

东极妙严
2026-02-08 19:22:25
来看中日对抗真是天意!高市票数大获全胜,将无人能阻日本修宪!

来看中日对抗真是天意!高市票数大获全胜,将无人能阻日本修宪!

青青子衿
2026-02-08 23:16:31
王楚钦赛前碎碎念“保护好腿”,孙颖莎乖乖点头,第一次这么听话

王楚钦赛前碎碎念“保护好腿”,孙颖莎乖乖点头,第一次这么听话

大嘴说台球
2025-12-16 20:35:22
各行各业都有秘密,没有例外,网友:黑色的内衣裤不要买!

各行各业都有秘密,没有例外,网友:黑色的内衣裤不要买!

另子维爱读史
2026-02-07 18:55:06
奔驰E级摊牌,31万多起售,其他品牌还能怎么玩?

奔驰E级摊牌,31万多起售,其他品牌还能怎么玩?

小李子体育
2026-02-08 20:26:02
A股:不必等待了,迹象已明确,明天周一,很可能将迎来新的转变

A股:不必等待了,迹象已明确,明天周一,很可能将迎来新的转变

夜深爱杂谈
2026-02-08 19:01:40
黄有龙做梦也没想到,自己花重金培养大的女儿,竟给赵薇做了嫁衣

黄有龙做梦也没想到,自己花重金培养大的女儿,竟给赵薇做了嫁衣

查尔菲的笔记
2025-12-16 15:14:06
铁了心对付中国?暴跌58%,俄罗斯大幅加税,中国汽车栽得太冤了

铁了心对付中国?暴跌58%,俄罗斯大幅加税,中国汽车栽得太冤了

爱吃醋的猫咪
2026-02-01 19:36:46
局座学生李莉:因多次预判美军阴谋,被中情局列入重点关注名单

局座学生李莉:因多次预判美军阴谋,被中情局列入重点关注名单

文史达观
2024-06-02 07:05:13
1903年,30岁梁启超和17岁王桂荃行房,两人大汗淋漓

1903年,30岁梁启超和17岁王桂荃行房,两人大汗淋漓

南权先生
2026-02-03 15:53:04
给孙子压岁钱别瞎包!马年4档吉利数,不攀比不委屈,全家都舒心

给孙子压岁钱别瞎包!马年4档吉利数,不攀比不委屈,全家都舒心

美食格物
2026-02-04 21:47:14
21年,韩国引进一中国东北虎,刚到韩国动物园,就遭到本土虎攻击

21年,韩国引进一中国东北虎,刚到韩国动物园,就遭到本土虎攻击

南权先生
2026-02-06 15:46:38
中国批准稀土出口,日媒欢呼:对华反制措施见效,下一秒遭打脸

中国批准稀土出口,日媒欢呼:对华反制措施见效,下一秒遭打脸

张鴘喜欢软软糯糯
2026-02-08 22:07:11
曼妙的身材:一副会呼吸的建筑

曼妙的身材:一副会呼吸的建筑

疾跑的小蜗牛
2026-01-20 22:35:32
果然巨大!解放军最强导弹震动岛内,赖清德敢潜逃,当心空中斩首

果然巨大!解放军最强导弹震动岛内,赖清德敢潜逃,当心空中斩首

东方点兵
2026-02-08 19:05:10
80年娶了厂里没人要的女劳犯被开除后,一辆上海牌轿车停我家楼下

80年娶了厂里没人要的女劳犯被开除后,一辆上海牌轿车停我家楼下

奶茶麦子
2026-02-08 16:40:16
罪有应得!官方彻查后,闫学晶再迎噩耗,她最担心的事还是发生了

罪有应得!官方彻查后,闫学晶再迎噩耗,她最担心的事还是发生了

来科点谱
2026-01-23 11:08:02
1964年克里姆林宫政变,46岁的他策划扳倒赫鲁晓夫,却被盟友算计

1964年克里姆林宫政变,46岁的他策划扳倒赫鲁晓夫,却被盟友算计

磊子讲史
2026-01-31 13:59:30
86年我给一个女犯人送饭,她偷偷塞给我一张纸条:救我,我是卧底

86年我给一个女犯人送饭,她偷偷塞给我一张纸条:救我,我是卧底

千秋文化
2026-01-20 20:48:49
楼市大概率要硬着陆了,就在3月?

楼市大概率要硬着陆了,就在3月?

巢客HOME
2026-02-08 10:20:08
2026-02-09 05:07:00
MediaTea
MediaTea
专业的数字媒体、新媒体技术
1744文章数 74关注度
往期回顾 全部

科技要闻

为实现雄心勃勃的计划,特斯拉开始招人

头条要闻

日本选举结果 可能让国家进入相当危险阶段

头条要闻

日本选举结果 可能让国家进入相当危险阶段

体育要闻

“我就是王楚钦” 王楚钦霸气指向球衣背后

娱乐要闻

金晨被罚1500后首露面,表情沉重心事重重

财经要闻

宽基ETF开年大赎回,什么信号?

汽车要闻

VLA司机大模型优化 理想汽车OTA8.3版本更新

态度原创

艺术
数码
游戏
教育
房产

艺术要闻

你绝对没见过!法国摄影师的光影人体彩绘震撼呈现

数码要闻

平民本地AI神器!苹果M4 Mac mini面临缺货

WRL年度总决赛:JT绝境翻盘夺得冠军!EW横扫SYG成就大满贯

教育要闻

今天,南京不少牛娃参加了这场考试!

房产要闻

实景超预期呈现!三亚豪宅,再迎封面之作!

无障碍浏览 进入关怀版