深入理解Python中的__builtin__和__builtins__

深入理解Python中的__builtin__和__builtins__深入理解 Python 中的 builtin 和 builtins pythonbuilt in

大家好,欢迎来到IT知识分享网。

摘要: 0.说明         这里的说明主要是以Python 2.7为例,因为在Python 3+中,__builtin__模块被命名为builtins,下面主要是探讨Python 2.x中__builtin__模块和__builtins__模块的区别和联系。

0.说明


1.名称空间(Namespace)

        首先不得不说名称空间,因为名称空间是Python中非常重要的一个概念,所谓名称空间,其实指的是名称(标识符)到对象的映射。

  • 内建名称空间
  • 全局名称空间

        如果定义了函数,则还会有局部名称空间,全局名称空间一般由在程序的全局变量和它们对应的映射对象组成,而局部名称空间则在函数内部由函数局部变量和它们对应的映射对象组成,这里关键的是内建名称空间,它到底是怎么产生的?


2.内建函数

1
2
3
4
>>> 
abs
(
-
1
)
1
>>> 
max
(
1

3
)
3

1
2
3
4
5
>>> 
abs
<built
-
in 
function 
abs
>
>>> 
>>> 
max
<built
-
in 
function 
max
>


3.内建名称空间与__builtins__

1
2
>>> 
dir
()
[
'__builtins__'

'__doc__'

'__name__'

'__package__'
]

1
2
>>> 
dir
(__builtins__)
[
'ArithmeticError'

'AssertionError'

'AttributeError'

'BaseException'

'BufferError'

'BytesWarning'

'DeprecationWarning'

'EOFError'

'Ellipsis'

'EnvironmentError'

'Exception'

'False'

'FloatingPointError'

'FutureWarning'

'GeneratorExit'

'IOError'

'ImportError'

'ImportWarning'

'IndentationError'

'IndexError'

'KeyError'

'KeyboardInterrupt'

'LookupError'

'MemoryError'

'NameError'

'None'

'NotImplemented'

'NotImplementedError'

'OSError'

'OverflowError'

'PendingDeprecationWarning'

'ReferenceError'

'RuntimeError'

'RuntimeWarning'

'StandardError'

'StopIteration'

'SyntaxError'

'SyntaxWarning'

'SystemError'

'SystemExit'

'TabError'

'True'

'TypeError'

'UnboundLocalError'

'UnicodeDecodeError'

'UnicodeEncodeError'

'UnicodeError'

'UnicodeTranslateError'

'UnicodeWarning'

'UserWarning'

'ValueError'

'Warning'

'ZeroDivisionError'

'_'

'__debug__'

'__doc__'

'__import__'

'__name__'

'__package__'

'abs'

'all'

'any'

'apply'

'basestring'

'bin'

'bool'

'buffer'

'bytearray'

'bytes'

'callable'

'chr'

'classmethod'

'cmp'

'coerce'

'compile'

'complex'

'copyright'

'credits'

'delattr'

'dict'

'dir'

'divmod'

'enumerate'

'eval'

'execfile'

'exit'

'file'

'filter'

'float'

'format'

'frozenset'

'getattr'

'globals'

'hasattr'

'hash'

'help'

'hex'

'id'

'input'

'int'

'intern'

'isinstance'

'issubclass'

'iter'

'len'

'license'

'list'

'locals'

'long'

'map'

'max'

'memoryview'

'min'

'next'

'object'

'oct'

'open'

'ord'

'pow'

'print'

'property'

'quit'

'range'

'raw_input'

'reduce'

'reload'

'repr'

'reversed'

'round'

'set'

'setattr'

'slice'

'sorted'

'staticmethod'

'str'

'sum'

'super'

'tuple'

'type'

'unichr'

'unicode'

'vars'

'xrange'

'zip'
]


4.__builtins__与__builtin__的简单区别

1
2
>>> __builtins__
<module 
'__builtin__' 
(built
-
in
)>

1
2
3
4
5
>>> 
import 
__builtin__
>>> 
import 
__builtins__
Traceback (most recent call last):
  
File 
"<stdin>"
, line 
1

in 
<module>
ImportError: No module named __builtins__

  • 在Python中并没有__builtins__这个模块,只有__builtin__模块,__builtins__模块只是在启动Python解释器时,解释器为我们自动创建的一个到__builtin__模块的引用

        当然,至于这种引用到底是怎么样,可以看下面的深入区别。


5.__builtins__与__builtin__的深入区别

(1)在主模块__main__中

1
2
>>> 
print 
__name__
__main__

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> 
import 
__builtin__
>>> __builtin__
<module 
'__builtin__' 
(built
-
in
)>
>>> __builtins__
<module 
'__builtin__' 
(built
-
in
)>
>>> __builtin__.__name__
'__builtin__'
>>> __builtins__.__name__
'__builtin__'
>>> __builtins__ 
=
= 
__builtin__
True
>>> __builtins__ 
is 
__builtin__
True
>>> 
id
(__builtins__)
3752
>>> 
id
(__builtin__)
3752

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>>> 
def 
func():
...     
print 
'test'
... 
>>> func
<function func at 
0x7f99012bdc08
>
>>> funcs
<function func at 
0x7f99012bdc08
>
>>> func.__name__
'func'
>>> funcs.__name__
'func'
>>> funcs 
=
= 
func
True
>>> funcs 
is 
func
True
>>> 
id
(funcs)
5432
>>> 
id
(func)
5432

(2)不是在主模块中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env python
 
import 
__builtin__
 
 
print 
'Module name:'
, __name__
 
 
print 
'*==test __builtin__ and __builtins__==*'
print 
'__builtin__ == __builtins__'
, __builtin__ 
=
= 
__builtins__
print 
'__builtin__ is __builtins__'
, __builtin__ 
is 
__builtins__
print 
'id(__builtin__)'

id
(__builtin__)
print 
'id(__builtins__)'

id
(__builtins__)
 
print 
'='
*
50
 
print 
'*==test __builtin__.__dict__ and __builtins__==*'
print 
'__builtin__.__dict__ == __builtins__'
, __builtin__.__dict__ 
=
= 
__builtins__
print 
'__builtin__ is __builtins__'
, __builtin__.__dict__ 
is 
__builtins__
print 
'id(__builtin__)'

id
(__builtin__.__dict__)
print 
'id(__builtins__)'

id
(__builtins__)

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> 
import 
test
Module name: test
*
=
=
test __builtin__ 
and 
__builtins__
=
=
*
__builtin__ 
=
= 
__builtins__ 
False
__builtin__ 
is 
__builtins__ 
False
id
(__builtin__) 
0504
id
(__builtins__) 
5608
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
*
=
=
test __builtin__.__dict__ 
and 
__builtins__
=
=
*
__builtin__.__dict__ 
=
= 
__builtins__ 
True
__builtin__ 
is 
__builtins__ 
True
id
(__builtin__) 
5608
id
(__builtins__) 
5608


6.总结

  • 如果是在主模块__main__中,__builtins__直接引用__builtin__模块,此时模块名__builtins__与模块名__builtin__指向的都是同一个模块,即<builtin>内建模块(这里要注意变量名和对象本身的区别)
  • 如果不是在主模块中,那么__builtins__只是引用了__builtin__.__dict__

        如果需要转载本文,请注明来自香飘叶子的51cto博客。

https://docs.python.org/2/library/__builtin__.html?highlight=_builtin__#module-__builtin__

http://www.52ij.com/jishu/665.html

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/145832.html

(0)
上一篇 2025-04-18 21:15
下一篇 2025-04-18 21:20

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信