Python中__builtins__与builtins的区别及相关使用疑问
Python builtins模块与__builtins__对象的常见疑问解析
为什么无需导入builtins就能用内置函数,却必须导入才能查看它的完整列表?
- Python的名字解析遵循局部作用域 → 全局作用域 → 内置作用域的优先级顺序。所有内置函数(比如
pow()、open())本质上都属于builtins模块的属性,解释器会自动把builtins模块的内容作为内置作用域的来源。 - 但
builtins这个模块名本身并不会默认出现在全局命名空间中。当你直接调用pow()时,解释器会在内置作用域找到对应的builtins.pow;但你直接写builtins时,全局命名空间里没有这个名字,自然会触发NameError。 - 只有执行
import builtins语句后,才会将builtins模块对象导入到全局命名空间,这时候才能通过dir(builtins)查看它的完整属性列表。
__builtins__是什么?为什么它和builtins的表现差异很大?
__builtins__是CPython解释器的内部实现细节,不属于Python语言规范的强制要求(其他实现如PyPy的行为可能不同)。它的存在是为了优化内置名字的查找效率。- 它的行为分两种场景:
- 在全局作用域(比如交互式命令行、主脚本模块):
__builtins__直接是builtins模块的引用,这时候dir(__builtins__)和dir(builtins)的结果应该完全一致。 - 在局部作用域(比如函数内部):
__builtins__实际上指向的是builtins.__dict__——也就是内置模块的命名空间字典。这时候dir(__builtins__)返回的是字典的所有键(即内置函数/属性的名称),而dir(builtins)返回的是模块对象的全部属性(包括__name__、__file__这类模块特有的特殊属性),两者的输出自然会有明显差异。
- 在全局作用域(比如交互式命令行、主脚本模块):
- 官方不推荐直接使用
__builtins__,因为它的行为依赖于具体的Python实现,可能在不同环境下表现不一致。
内容的提问来源于stack exchange,提问作者rkg125
相关产品推荐
相关产品推荐

