在学习Python时,很多人会问到__builtin__、__builtins__和builtins之间有什么关系。百度或Google一下,有很 多答案,但是这些答案要么不准确,要么只说了一点点,并不全面。本文将给大家一个较为全面的答案。以下结果是经过本人试验过的(测试环境:Linux Mint 14, Python2.7.3和Python3.2.3),并参考了Python的邮件列表。

在Python中,有一个内建模块,该模块中有一些常用函数;而该模块在Python启动后、且没有执行程序员所写的任何代码前,Python会首先加载 该内建函数到内存。另外,该内建模块中的功能可以直接使用,不用在其前添加内建模块前缀,其原因是对函数、变量、类等标识符的查找是按LE(N)GB法 则,其中B即代表内建模块。比如:内建模块中有一个abs()函数,其功能是计算一个数的绝对值,如abs(-20)将返回20。

在Python2.X版本中,内建模块被命名为__builtin__,而到了Python3.X版本中,却更名为builtins。

当使用内建模块中函数或其它功能时,可以直接使用,不用添加内建模块的名字;但是,如果想要向内建模块中添加一些功能,以便在任何函数中都能直接使用而不 用再进行import,这时,就要导入内建模块,在内建模块的命名空间(即__dict__字典属性)中添加该功能。在导入时,如果是Python2.X 版本,就要导入__builtin__模块;如果是Python3.X版本,就要导入builtins模块。如:在Python2.X中,向内建模块添加 一个函数(该函数打印“hello, world”),可以这样写(以下的用法是在主模块中的使用,其它模块请看下面):

import __builtin__

def print_hello():

print "hello, world"

__builtin__.__dict__['hello'] = print_hello

print_hello() # 将打印"hello, world"

hello() # 将打印"hello, world"

此时,print_hello和hello两个函数名几乎是一样,但是有一点区别,print_hello只能在该模块中使用,而hello可以在本程序中的其它任何一个模块中使用,因为hello已经放到内建模块中了。

现在,__builtin__和builtins之间的关系已经说清楚了,现在该说说__builtins__了。为了统一Python2.X和Python3.X,在下面的论述中,内建模块一律统称为__builtin__。

由上面的论述,我们知道,__builtin__存在于Python2.X中,而builtins存在于Python3.X中,但是对于 __builtins__,它却同时存在于Python2.X和Python3.X中。那么它到底是什么东西呢?由名字可知,它肯定与内建模块有关。其实 简单地说,它就是对内建模块一个引用。

1、__builtins__即是引用,那么它内建模块有一个相同点:Python程序一旦启动,它们二者就会在程序员所写的代码没有运行之前就已经被加载到内存中了。

2、虽是一个引用,但__builtins__和内建模块是有一点区别的:

(1)无论任何地方要想使用内建模块,都必须在该位置所处的作用域中导入__builtin__内建模块;而对于__builtins__却不用导入,它在任何模块都直接可见, 可以把它当作内建模块直接使用(这句并不完全正确,请看第(2)点)。即:__builtins__在任何地方、任何模块都可见,而内建模块名只在相应的 作用域中被import后才可以(该import并不是把内建模块加载到内存中——内建早已经被加载了,它仅仅是让内建模块名在该作用域中可见)。

(2)__builtins__虽是对内建模块的引用,但这个引用要看是使用__builtins__的模块是哪个模块:

1】 在主模块__main__中:

__builtins__是对内建模块__builtin__本身的引用,即__builtins__完全等价于__builtin__,二者完全是一个东西,不分彼此。它在任何地方都可见,即在任何地方都可使用它。此时,__builtins__的类型是模块类型。

__builtin__仅仅在导入它时才可见。哪个作用域中使用__builtin__,哪个作用域就要导入它(导入仅仅是让__builitin__标 识符在该作用域内可见)。一般都是在模块的顶层(即模块的全局作用域)导入__builtin__,这样,其后的任何作用域可通过标识符向上查找来引用 __builtin__。

2】在非__main__模块中:

__builtins__仅是对__builtin__.__dict__的引用,而非__builtin__本身。它在任何地方都可见。此时__builtins__的类型是字典。

__builtin__和在主模块中的情况一样。

由上面的异同,我们可以出,__builtins__、__builtin__和builtins之间并没有太大的不同;在使用__builtins__时,只要注意其引用的到底是__builtin__还是__builtin__.__dict__即可。

此时,可能会有人说,既然__builtin__和builtins由于Python版本的不同而不同,导致在写兼容2.X和3.X版本时的代码时比较麻 烦,而__builtins__在2.X和3.X中都是一样的,那么,不再使用builtins和__builin__,改用__builtins__不 是更好?!这种做法并没有错,但是有一点,在使用__builtins__时,要区分是在主模块__main__中,还是在其他的非__main__模块 中。笔者看了Python标准库(比如gettext),其中使用的是__builtin__(在Python2.X中)和builtins(在 Python3.X中),而并没有使用__builtins__。这仅仅给一些参考。

说明:

主模块__main__:在Python中,一个代码文件就是一个模块,一个模块就是一个代码文件;用来启动Python或者说首先执行的那个文件(相当 于C语言中main主函数所在的C文件)的模块名被Python命名为__main__,称为主模块,而对于其它被主模块或其他非主模块导入的模块,它们 的模块名则是文件名本身(除了后缀.py、.pyc或.pyo等)。每个模块都有一个名为__name__的属性,它表示着该模块的名字。除此之外,主模 块与其它非主模块之间还有一点区别,比如:from __future__ import absolute_import语句在非主模块中可以正常使用,反而在主模块中,好像没有什么效果——有等无。

__builtin__与__builtins__的区别与关系相关推荐

  1. 深入理解 Python2 中的 __builtin__ 和 __builtins__

    这里以 Python 2.7为例,探讨 __builtin__ 模块和 __builtins__ 模块的区别和联系. 在 Python3 中,__builtin__ 模块被命名为 builtins 1 ...

  2. js和html以及css的区别,html、css、js中的区别与关系

    html.css.js中的区别与关系 2020/04/26 作者: 互盟股份 今天小盟给大家分享的是html.css.js中的区别与关系,相信很多人都不太了解,为了让大家更加了解html.css.js ...

  3. 电脑物理内存与虚拟内存的区别与关系

    我们不能听到或看到内存二字,就认为是可以看到见,摸得到的东西.我们常听说的"虚拟内存"和 "物理内存"是不能混为一谈的.我们主要从以下方面进行探讨. 物理内存是 ...

  4. Java中抽象类和接口在概念、语法和应用上的区别和关系

    2019独角兽企业重金招聘Python工程师标准>>> 春招开始了,盆友们都忙着准备笔试.准备面试,复习学过的知识点,当然我也不例外,在这里祝每一个"有心人"心想 ...

  5. PXIe,PXI,CPCI相互区别和关系,总线之间,几种机箱之间是否兼容?

    区别和关系: PXIe:PXI规范中添加PCIe而称为PXIe.与PXI和PCI的关系相同,PXIe规范中也包含了测试测量领域所需要的各种扩展特性. PXI:PXI是一种专为工业数据采集与自动化应用度 ...

  6. 外观html与外观css的区别,用房间和装修来解读html代码与css样式的区别和关系

    想要了解html与css的区别和关系,就必须要知道这2个东西的特点和主要用途用法等.html语言是一种超文本标记语言,通过html语言中的各种标签(如table.p.div等),可以设计出很多不同结构 ...

  7. mysql外码内码定义_刨根究底字符编码之六——简体汉字编码中区位码、国标码、内码、外码、字形码的区别及关系...

    简体汉字编码中区位码.国标码.内码.外码.字形码的区别及关系 GB2312.GBK.GB18030等GB类汉字编码方案的具体实现方式是怎样的?区位码是什么?国标码是什么?内码.外码.字形码又是什么意思 ...

  8. 字、字节、位、字长的区别与关系

    字.字节.位.字长的区别与关系 一.数据存储单位 1.位(bit) 2.字节(byte) 3.字 二.字符与字节对应关系 三.字长 一.数据存储单位 字 > 字节 > 位 1位=1比特 1 ...

  9. 刨根究底字符编码之六——简体汉字编码中区位码、国标码、内码、外码、字形码的区别及关系

    简体汉字编码中区位码.国标码.内码.外码.字形码的区别及关系 GB2312.GBK.GB18030等GB类汉字编码方案的具体实现方式是怎样的?区位码是什么?国标码是什么?内码.外码.字形码又是什么意思 ...

最新文章

  1. [linux]查看linux下端口占用
  2. 移动磁盘格式化了,要如何寻回数据
  3. 如何解决python3.5.2安装scrapy的无法查找到vsvarall的问题
  4. 汇编语言LENGTHOF运算符:计算数组中元素的个数
  5. 使用Spring Boot,JHipster和React构建照片库PWA
  6. nn.functional 和 nn.Module入门讲解
  7. 2019年,50万大数据DT粉丝都爱的10本书
  8. xadmin获取mysql_Django2集成xadmin详解-5-获取登录用户信息并填充相应Model字段
  9. 【易语言界面开发系列教程之(EX_UI使用系列教程(12)--EX组件(列表框EX))】
  10. android表格布局的属性,android:TableLayout表格布局详解
  11. 怎么彻底关闭UAC(user account control)?
  12. CM4下SPI接口CAN模块配置流程
  13. java小练习:乘法表的实现(不止是9)
  14. 转载文章-【工具】10分钟快速搭建属于自己的文档网站-来自掘金
  15. Modern Robotics读书笔记(一)
  16. 一个很好用的gif动态图控件:GifImageView
  17. 《自然语言处理实战入门》---- 神经网络与推荐系统初步简介
  18. 太极阴,阳虚拟框架----各种插件大总结(烂尾)
  19. python简单的输出星期几
  20. [初窥目标检测]——《目标检测学习笔记(2):浅析Selective Search论文——“Selective Search for object recognition”》

热门文章

  1. oracle ocr组成员替换,Oracle RAC 迁移替换 OCR 盘
  2. android 调整字体,android设置:调整字体大小
  3. MySQL知识梳理与命令操作
  4. 怎么解释三线圈直流电机工作原理更好?
  5. 利用棋盘格重新校正摄像头,求取Apriltag取向
  6. STC单片机下载实验
  7. q函数表格怎么看_会计表格函数玩不会?超实用会计表格函数公式大全,财务人都在用...
  8. python文件中数字排序_Python 对输入的数字进行排序的方法
  9. Linux 设备驱动中的并发控制 小感
  10. spark数据查询语句select_sparksql读取hive表中数据