Python中的默认模块是什么(例如,当我们运行"print"时导入的模块)
在Python中,启动编译器时会自动导入哪些默认模块呢?
比如说,有print
函数、加法和其他一些数学函数。
这些函数肯定是在Python的某个地方定义的。
我猜想我们可以通过查找这些信息来了解,比如说如果我们知道print
函数是从哪里来的,那我们就能找到它所属的模块。
6 个回答
Python有三种作用域:
- 局部作用域
- 全局作用域
- 内置作用域
如果你执行以下这个函数:
def foo():
print('bar')
Python会从上到下在这三种作用域中寻找print
这个函数。首先,它会检查在foo
这个函数内部是否有一个叫print
的局部变量。如果没有找到,它就会继续查找这个print
是否是全局的脚本或模块对象(在这个例子中,foo
函数就是这样的一个对象)。如果还是没有找到,它就会去__builtin__
模块里查找。
__builtin__
模块是定义所有像print
这样的函数的地方。它还包含了一些内置的异常类。
加法和其他运算符是不同的,因为它们是作用于对象的。每个对象都有一个类型,比如整数123
的类型是int
。int
类型定义了两个整数是如何相加的,以及结果是什么。
在CPython
(从python.org下载的Python版本)中,__builtin__
模块和所有基本类型(int
、str
、list
等)都是用C语言编写的,并且是核心的一部分(也就是python
这个可执行文件)。还有其他一些模块也是用同样的方式编写的,最著名的就是sys
模块。你在Python的标准库中找不到sys.py
这个文件。
这些函数都是模块 __builtins__
的一部分。你可以打开一个 Python 的命令行界面,然后查看帮助信息 -
>>> help(__builtins__)
在Python中,“模块”有它特定的意思。像“print”和“addition”这些都不是模块。
+
和其他的“数学函数”其实是运算符,而像for
、in
、if
这些是关键字,它们不是函数,所以不会出现在__builtins__
里面。
如果你想知道启动Python时加载了哪些模块,可以查看sys.modules.keys()
:
$ python -i
Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.modules.keys()
['copy_reg', 'sre_compile', 'locale', '_sre', 'functools', 'encodings', 'site',
'__builtin__', 'sysconfig', 'operator', '__main__', 'types', 'encodings.encodings',
'abc', '_weakrefset', 'errno', 'encodings.codecs', 'sre_constants', 're', '_abcoll',
'ntpath', '_codecs', 'nt', '_warnings', 'genericpath', 'stat', 'zipimport',
'encodings.__builtin__', 'warnings', 'UserDict', 'encodings.cp1252', 'sys',
'codecs', 'os.path', '_functools', '_locale', 'signal', 'traceback', 'linecache',
'encodings.aliases', 'exceptions', 'sre_parse', 'os', '_weakref']