本文最后更新于 2024-12-17,文章内容可能已经过时。

Python解释器命名空间

学习目标

掌握Python代码格式与风格

掌握Python标识符与关键字

掌握Python常量、变量

掌握解释器命名空间

熟悉内置函数、类与对象的概念以及应用

熟悉模块与文件对象的概念及应用

BG4-Python解释器

Python解释器也是一个程序,它解释执行Python代码。解释器由一个编译器和一个虚拟机构成,编译器负责将源代码转换成字节码文件,而虚拟机负责执行字节码。因此,解释型语言也有编译过程,只不过这个编译过程并不是直接生成目标代码,而是生成中间代码(字节码),然后再通过虚拟机来逐行解释执行字节码。

6款Python解释器

Cpython:是用C语言开发的官方默认解释器。
Ipython:是基于CPython之上的一个交互式解释器。
PyPy:采用JIT技术,对Python代码进行动态编译,可提高代码的执行速度。
Jython:是运行在Java平台上的Python解释器,可直接编译成Java字节码执行。
IronPython:是运行在微软.Net平台上的Python解释器,可直接编译成.Net的字节码。
MicroPython:以微控制器为目标,针对嵌入式环境。

常见的6款Python解释器

Python源程序执行过程

(1)执行pythonXX.py后,将会启动Python解释器。
(2)Python解释器的编译器会将.py源文件编译成字节码,生成PyCodeObject字节码对象存放在内存中。
(3)Python解释器的虚拟机将执行内存中的字节码对象,并将其转换为机器语言,虚拟机与操作系统交互,使机器语言在机器硬件上运行。
(4)运行结束后,Python解释器将PyCodeObject写入pyc文件中。当Python程序第二次运否则就重复上面的过程。

Python源程序执行过程

BG5-命名空间

在程序开发中,由不同的人员开发不同的模块,难免会出现重名的情况。因此,解释器对标识符、变量等采用命名空间的方式来管理编译对象的名称。命名空间就是一些命名(名称)的集合,它们与相应的对象有对应关系。多个命名空间相互独立,允许不同命名空间中有相同的名称。每个命名空间都是一个容器,容器内的元素可以映射到对象的名称,对象对应的名称分为变量名、函数名、类名、模块名、属性名。

1、内置命名空间

内置命名空间是运行Python解释器时,解释器自动导入内建模块builtins时创建的命名空间,包含的对象有内置常量、内置函数、内置异常类等。内置命名空间的对象在整个应用程序中都可以使用。dir()函数命令不带参数,可返回解释器当前范围内的变量、对象的内容列表,见示程序段3-1。

程序段3-1 dir()函数命令

从运行结果可知,独立运行解释器,解释器当前范围名称属性“_name_”的值是“_main_”。解释器把自动导入的内置模块构建为对象“_builtins_”,其类型是“<module'builtins'(built-in)>”,其名称属性“_builtins_.name_”的值是“builtins”。内置命名空间就是_builtins_指向的空间,解释器会自动查找此空间。dir(_builtins_)命令返回了内置命名空间的内容。

2、全局命名空间

全局命名空间是运行Python解释器时,解释器执行Python源文件时创建的命名空间,包含的对象有当前文件中的函数、类、全局变量,以及导入的其他模块的成员。Python解释器在启动时会自动创建全局命名空间及解释器当前运行空间(或称为解释器主空间),并把运行的文件作为主模块对象,其名称属性值是“_main_”,同时,自动导入内建模块builtins,内置命名空间的对象也完全由应用程序使用。单独运行解释器,用globals()查看全局命名空间,见程序段3-2。

# 解释器控制台输入
globals()

# 输出
{'__name__': '__main__',
 '__doc__': 'Automatically created module for IPython interactive environment',
 '__package__': None,
 '__loader__': None,
 '__spec__': None,
 '__builtin__': <module 'builtins' (built-in)>,
 '__builtins__': <module 'builtins' (built-in)>,
 '_ih': ['',
  "print('PyDev console: using IPython 8.5.0\\n')\n\nimport sys; print('Python %s on %s' % (sys.version, sys.platform))\nsys.path.extend(['C:\\\\Users\\\\wangjincheng\\\\Desktop\\\\Hello算法'])",
  'globals()'],
 '_oh': {},
 '_dh': [WindowsPath('C:/Users/wangjincheng/Desktop/Hello算法')],
 'In': ['',
  "print('PyDev console: using IPython 8.5.0\\n')\n\nimport sys; print('Python %s on %s' % (sys.version, sys.platform))\nsys.path.extend(['C:\\\\Users\\\\wangjincheng\\\\Desktop\\\\Hello算法'])",
  'globals()'],
 'Out': {},
 'get_ipython': <bound method InteractiveShell.get_ipython of <_pydev_bundle.pydev_ipython_console_011.PyDevTerminalInteractiveShell object at 0x0000019926F30AF0>>,
 'exit': <IPython.core.autocall.ExitAutocall at 0x19926f300a0>,
 'quit': <IPython.core.autocall.ExitAutocall at 0x19926f300a0>,
 '_': '',
 '__': '',
 '___': '',
 '_i': "print('PyDev console: using IPython 8.5.0\\n')\n\nimport sys; print('Python %s on %s' % (sys.version, sys.platform))\nsys.path.extend(['C:\\\\Users\\\\wangjincheng\\\\Desktop\\\\Hello算法'])",
 '_ii': '',
 '_iii': '',
 '_i1': "print('PyDev console: using IPython 8.5.0\\n')\n\nimport sys; print('Python %s on %s' % (sys.version, sys.platform))\nsys.path.extend(['C:\\\\Users\\\\wangjincheng\\\\Desktop\\\\Hello算法'])",
 'sys': <module 'sys' (built-in)>,
 '_i2': 'globals()'}

程序段3-2 全局命名空间

globals()命令返回了全局命名空间的成员及其值,用字典表示。

表2-2Python3关键字

3、局部命名空间

局部命名空间是在定义类、调用函数时创建的,包含类的属性、被调用函数参数和函数内部定义的变量等。在函数内部可以用 print(locals0)打印输出局部命名空间内容。