zoukankan      html  css  js  c++  java
  • python 内置命名空间、标准库、模块相关概念

    内置命名空间

    python 解释器启动后就可以直接使用一些函数,常量,类型,异常等。保存这些数据的空间统称内置命名空间。

    内置命名空间中包含的数据如下:

    对于内置命名空间中最常用的就是内置函数。
    内置函数
    Python 解释器自带的函数叫做内置函数,这些函数可以直接使用,不需要import就可以使用。Python 解释器一旦启动,所有的内置函数都生效。

    内置常量
    python对于变量的查找,模块的查找顺序是LEGB

    L: Local 局部命名空间
    E: Enclosing 内嵌命名空间
    G: Golbal 全局命名空间
    B: Builtin 内置命名空间

    所以内置命名空间是查找的最后一道屏障,如果这里也没有,那这个变量就是没有定义。

    >>> a
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'a' is not defined
    

    python 标准库

    Python 标准库相当于解释器的外部扩展,它并不会随着解释器的启动而启动,要想使用这些外部扩展,必须提前导入。
    Python 标准库非常庞大,包含了很多模块,要想使用某个函数,必须提前import对应的模块,否则函数是无效的。

    和内置命名空间的关系:

    1. 内置命名空间中的函数,变量,类型,异常都是标准库的一部分
    2. 内置空间在python解释器启动时加载内存,标准库有部分模块会记载到内存
    3. 内置空间不需要import就能使用模块,标准库需要import之后才能使用

    特征
    Python 标准库非常庞大,所提供的组件涉及范围十分广泛,正如以下内容目录所显示的。这个库包含了多个内置模块 (以 C 编写),Python 程序员必须依靠它们来实现系统级功能,例如文件 I/O,此外还有大量以 Python 编写的模块,提供了日常编程中许多问题的标准解决方案。其中有些模块经过专门设计,通过将特定平台功能抽象化为平台中立的 API 来鼓励和加强 Python 程序的可移植性。

    python标准库有200多个模块和包,具体可见上一篇博客 python标准库

    加载到内存中的模块

    在介绍内置命名空间时我们知道内置函数,变量,类型,异常都随着解释器的启动加载到内存中。那么能不能看到所有加载到内存中的模块呢?
    sys.modules 模块就是查找所有内存中的模块的方法。

    sys.modules
    Python中所有加载到内存的模块都放在sys.modules。sys.modules是一个全局字典

    功能
    字典sys.modules对于加载模块起到了缓冲的作用,当import一个模块时首先会在这个列表中查找是否已经加载了此模块,如果加载了则只是将模块的名字加入到正在调用import的模块的Local名字空间中。如果没有加入则将模块加入到当前空间,并且也加入到sys.modules中。再次import模块则不会在加在到内存中。

    使用
    sys.modules 是一个字典,key就是模块的名字, value是模块的对象。
    sys.modules.keys()

    >>> sys.modules.keys()
    dict_keys(['sys', 'builtins', '_frozen_importlib', '_imp', '_thread', 
    '_warnings', '_weakref', 'zipimport', '_frozen_importlib_external', 
    '_io', 'marshal', 'posix', 'encodings', 'codecs', '_codecs', 'encodings.aliases', 
    'encodings.utf_8', '_signal', '__main__', 'encodings.latin_1', 'io', 
    'abc', '_abc', 'site', 'os', 'stat', '_stat', 'posixpath', 'genericpath', 
    'os.path', '_collections_abc', '_sitebuiltins', 'sitecustomize', 'readline', 
    'atexit', 'rlcompleter'])
    
    >>> sys.modules.values()
    dict_values([<module 'sys' (built-in)>, <module 'builtins' (built-in)>, 
    <module '_frozen_importlib' (frozen)>, <module '_imp' (built-in)>, 
    <module '_thread' (built-in)>, <module '_warnings' (built-in)>, 
    <module '_weakref' (built-in)>, <module 'zipimport' (built-in)>, 
    <module '_frozen_importlib_external' (frozen)>, <module 'io' (built-in)>, 
    <module 'marshal' (built-in)>, <module 'posix' (built-in)>, 
    <module 'encodings' from '/usr/lib/python3.7/encodings/__init__.py'>, 
    <module 'codecs' from '/usr/lib/python3.7/codecs.py'>, 
    <module '_codecs' (built-in)>,
    <module 'encodings.aliases' from '/usr/lib/python3.7/encodings/aliases.py'>, 
    .......
    

    对于sys.modules中的模块是可以直接使用的。通过sys.modules找到该模块就可以直接使用内存中的模块
    如不需要import os 就可以直接使用 os 模块

    >>> sys.modules['os'].getcwd()
    '/home/ljk'
    

    但是如果直接使用os.getcwd()就会报错。

    >>> os.getcwd()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'os' is not defined
    

    如果再imports os,os模块也不会再次加载到内存中,因为内存中已经存在该模块对象了。

    >>>sys.modules['os']
    <module 'os' from '/usr/lib/python3.7/os.py'>
    

    再次导入在内存中会创建一个变量 os 指向内存中的 os模块对象。

    >>> import os
    >>> 
    >>> sys.modules['os'] is os
    True
    

    缓存功能
    当import 一个模块之后,就会在sys.modules中保存模块,在全局范围中,如果再次导入该模块,则不会重复加载到内存。

    >>> import sys
    >>> 
    >>> 'a' in sys.modules.keys()
    False
    >>> 
    >>> import a
    >>> 
    >>> 'a' in sys.modules.keys()
    True
    >>> 
    >>> sys.modules.get('a')
    <module 'a' from '/home/ljk/Desktop/a.py'>
    >>> 
    
  • 相关阅读:
    Android Jetpack之WorkManager: 观察结果
    解决'androidx.arch.core:core-runtime' has different version for the compile (2.0.0) and runtime (2.0.1)
    我要研究一下minio,管理大量的照片
    分发消息的写法
    百度地图坐标转换
    HighChart 实现从后台取数据来实时更新柱状和折线组图
    导出Excel
    Java 8新特性之集合
    java中的Switch case语句
    提问:"~"运算符
  • 原文地址:https://www.cnblogs.com/goldsunshine/p/15085333.html
Copyright © 2011-2022 走看看