大家好,欢迎来到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