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

Python:__code__ 详解

0
分享至

在 Python 中,函数是“一等对象”,它们不仅仅包含可调用的逻辑,还携带大量由解释器维护的内部状态。其中最核心的结构之一,就是函数的 __code__ 属性。

__code__ 是一个code object(代码对象),包含了执行所需的所有静态信息:字节码、局部变量表、常量表、闭包变量、行号表、运行栈需求等。

理解 code object 是深入掌握 Python 执行模型的重要一步。

一、__code__ 是什么?

当 Python 执行一个 def 时,发生三件事:

• 源代码被编译成 bytecode(字节码)

• 字节码被封装为一个 code object(代码对象)

• 代码对象再被包在一个 function object(函数对象)中

结构示意:

源代码 → code object → function object

因此:

• __code__ 是函数的“可执行内核”

• 函数本身只是对 code object 的一层包装(包含名字、默认值、注解、闭包等)

示例:

print(type(f.__code__))

输出:

重点特性:

(1)code object 是不可变的(immutable)。

(2)但可以利用 types.CodeType() 创建新的 code 对象来替换函数的 __code__。

(3)Python 3.11+ 中 code object 内部结构大幅修改(但属性接口基本保持兼容)。

二、__code__中包含哪些信息

__code__ 记录了函数执行所需的全部静态信息,主要分为四类。

(1)参数与变量信息

属性名

含义

co_argcount

位置参数数量

co_posonlyargcount

仅限位置参数数量(3.8+)

co_kwonlyargcount

仅关键字参数数量

co_varnames

所有局部变量名(包含参数)

co_nlocals

局部变量数量

示例:

print(test.__code__.co_nlocals)   # 3

提示:

若需要所有局部变量名,不要只看 co_varnames,而应合并 co_varnames + co_cellvars。这是实践中常见的做法。

(2)名称解析相关

属性名

含义

co_names

函数体内引用的全局变量、属性名等

co_consts

常量表(字面量、内部函数 code 对象等)

co_qualname

函数的完整名称(含类名等)

示例:

print(f.__code__.co_consts)  # (None, 1)

注意:

co_consts[0] 通常是 None(函数隐式返回 None)。

(3)闭包结构

属性名

含义

co_freevars

当前函数中使用,但定义在外层作用域的变量

co_cellvars

当前函数中定义,并被内部函数引用的变量

示例:

print("inner.co_cellvars:", fn.__code__.co_cellvars)

输出:

inner.co_cellvars: ()

解释:

名称

在 outer 中

在 inner 中

归类

a

参数,被 inner 使用 → cellvar

来自外层 → freevar

cellvar + freevar

b

局部变量,被 inner 使用 → cellvar

来自外层 → freevar

cellvar + freevar

c

局部变量,被 inner 使用 → cellvar

来自外层 → freevar

cellvar + freevar

inner

outer 的局部变量,但未被捕获

只在 outer.co_varnames

简要说明:

• cellvars:我定义,内部函数你使用

• freevars:我使用,外层函数定义

(4)字节码与执行元信息

属性名

含义

co_code

字节码(3.11 前单纯的 bytecode,3.11+ 结构变化但属性仍存在)

co_firstlineno

函数起始行号

co_stacksize

执行时需要的栈大小

co_flags

标志位(是否为生成器、是否包含 varargs 等)

co_linetable/ co_exceptiontable

(3.11+)行号表与异常表

(5)Python 3.11+ 的新结构

从 3.11 开始,字节码结构发生重大变化:

新增 co_exceptiontable(替代旧行号表处理异常)

新增 co_linetable(替代 co_lnotab)

字节码采用 adaptive bytecode(动态优化的自适应字节码)

三、__code__与字节码

一个函数最终执行的是字节码(bytecode),可以使用 dis 模块查看。

示例:

dis.dis(f)

输出(示例):

              6 RETURN_VALUE

Python 3.11 的字节码更加复杂(adaptive),但 code object 属性仍提供统一访问入口。

四、__code__的生命周期

(1)函数定义时创建(def 执行就生成 code 对象)。

(2)__code__ 是不可变的(保证执行安全)。

(3)多个函数可能共享同一个 __code__。

例如:

print({id(fn.__code__) for fn in lst})

这些 lambda 会共享同一 code 对象。

(4)重新定义同名函数会创建新的 code 对象。

(5)无引用时由 GC 自动回收。

五、修改__code__

由于 __code__ 可被赋值,我们可以动态改变函数行为,这属于 Python 的元编程能力:

print(f())   # 999

注意事项:

• 参数数量必须一致,否则抛 ValueError

• freevars/cellvars 数量必须一致

• 适用于调试器、框架、元编程,不建议在业务代码中使用

小结

__code__ 是 Python 函数的可执行核心,记录了字节码、局部变量、常量表、闭包结构、行号表等全部静态信息。

函数只是对 code object 的包装,而 code object 在函数定义时由编译器生成,并在运行期间保持不可变。通过 co_freevars 和 co_cellvars 可以理解闭包如何捕获外层变量,通过 co_code 和 dis 可以了解 Python 的执行模型,而在必要时替换 __code__ 还能动态改变函数行为。


点赞有美意,赞赏是鼓励

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

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.

相关推荐
热点推荐
宜家最“偷懒”的广告,却高级得离谱

宜家最“偷懒”的广告,却高级得离谱

设计癖
2026-01-27 11:46:53
“延迟满足”更易成功?那是骗你的

“延迟满足”更易成功?那是骗你的

老端的观点
2026-02-19 21:50:56
女人哪两个部位对男人最有吸引力?

女人哪两个部位对男人最有吸引力?

大熊欢乐坊
2026-02-20 18:48:16
这就是为什么不要欺负底层员工的原因!网友:1600万结款直接报废

这就是为什么不要欺负底层员工的原因!网友:1600万结款直接报废

另子维爱读史
2026-02-01 20:32:25
“看完瞬间没了性欲……”,请谨慎阅读!

“看完瞬间没了性欲……”,请谨慎阅读!

尚曦读史
2026-02-20 16:48:47
48岁保洁阿姨睡在公司1个月,老板打开了监控,第2天送给她20万

48岁保洁阿姨睡在公司1个月,老板打开了监控,第2天送给她20万

秀秀情感课堂
2025-12-12 14:20:05
著名相声演员离世

著名相声演员离世

豆哥记录
2026-01-07 11:15:43
谢晖有望三月出任申花主帅,韦世豪与张琳芃随队转会传闻遭辟谣

谢晖有望三月出任申花主帅,韦世豪与张琳芃随队转会传闻遭辟谣

卿子书
2026-02-19 10:31:26
月薪五千的朝鲜姑娘,和她们回不去的中国梦

月薪五千的朝鲜姑娘,和她们回不去的中国梦

百姓闻世界
2026-02-17 07:29:21
长沙“年入35万扛楼小伙”:不想一辈子扛楼,以后想做生意挣钱买房

长沙“年入35万扛楼小伙”:不想一辈子扛楼,以后想做生意挣钱买房

封面新闻
2026-02-19 19:49:03
建议中老年人:少吃稀饭馒头,常吃3种高钾食物,腿脚有劲精神足

建议中老年人:少吃稀饭馒头,常吃3种高钾食物,腿脚有劲精神足

江江食研社
2026-02-12 08:30:15
理想、蔚来等6家车企扎堆植入?《飞驰人生3》赢麻了

理想、蔚来等6家车企扎堆植入?《飞驰人生3》赢麻了

情感大头说说
2026-02-20 18:23:32
“妈,我想死你了!”河南小伙离家出走1年,母亲在短视频刷到其在南京一菜场附近出现

“妈,我想死你了!”河南小伙离家出走1年,母亲在短视频刷到其在南京一菜场附近出现

都市快报橙柿互动
2026-02-20 14:07:47
和平已无望?马斯克预言大战时间,美政府已签字:提到台湾省8次

和平已无望?马斯克预言大战时间,美政府已签字:提到台湾省8次

兴史兴谈
2026-01-07 06:19:46
生姜立大功?美国研究发现:生姜可在48小时内清除50%老化细胞?

生姜立大功?美国研究发现:生姜可在48小时内清除50%老化细胞?

39健康网
2026-02-11 09:11:33
大批美国游客涌入中国,回国后坦言:客观对比,中国比美国强多了

大批美国游客涌入中国,回国后坦言:客观对比,中国比美国强多了

青仔的世界
2026-02-16 11:54:44
太诡异,越南春联上已没有汉字!越南去汉字化确实很成功

太诡异,越南春联上已没有汉字!越南去汉字化确实很成功

魔都姐姐杂谈
2026-02-18 13:09:07
男子逃亡16年,赃款娶四妻生十二娃,被捕时家产数亿

男子逃亡16年,赃款娶四妻生十二娃,被捕时家产数亿

星星没有你亮
2026-02-20 08:31:25
炸完北溪才发现:,CIA这出“精分大戏”,演给鬼看呢?

炸完北溪才发现:,CIA这出“精分大戏”,演给鬼看呢?

梦在深巷aqa
2026-02-20 18:22:05
提前续约,5年2.5亿,联盟第一高薪出现!斯通该如何抉择?

提前续约,5年2.5亿,联盟第一高薪出现!斯通该如何抉择?

体育大朋说
2026-02-20 17:23:09
2026-02-20 19:23:00
MediaTea
MediaTea
专业的数字媒体、新媒体技术
1760文章数 76关注度
往期回顾 全部

科技要闻

莫迪举手欢呼 两大AI掌门人却握拳尴尬对峙

头条要闻

歌曲被王菲春晚选中 原唱感激:王菲让这首歌充满神性

头条要闻

歌曲被王菲春晚选中 原唱感激:王菲让这首歌充满神性

体育要闻

宁忠岩:我拿过那么多银牌和铜牌 现在终于赢了

娱乐要闻

苏翊鸣夺金朱易示爱,两人默契引热议

财经要闻

太疯狂!“顾客不问价直接出手”

汽车要闻

量产甲醇插混 吉利银河星耀6甲醇插混版申报图

态度原创

艺术
房产
教育
旅游
军事航空

艺术要闻

李白若在世,诺贝尔文学奖会是他的囊中物吗?

房产要闻

春节三亚楼市再放大招!千亿巨头,重磅推出超性价比海景现房

教育要闻

“院校专业组”志愿怎么填?2026年最新填报步骤与策略

旅游要闻

看表演、赏花灯、踏云梯 各地精彩活动让年味儿更浓

军事要闻

消息人士透露:美军赴黄海活动 解放军有效应对处置

无障碍浏览 进入关怀版