Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sys.modules和globals()中的模块名称_Python - Fatal编程技术网

Python sys.modules和globals()中的模块名称

Python sys.modules和globals()中的模块名称,python,Python,如果我导入一个模块,模块名称将同时显示在sys.modules和globals()中。如果我再次删除它,它将从globals()中删除,但仍驻留在sys.modules中。为什么会这样 import mymodule 'mymodule' in globals() # True 'mymodule' in sys.modules # True del mymodule 'mymodule' in globals() # False 'mymodule' in sys.modules #

如果我导入一个模块,模块名称将同时显示在
sys.modules
globals()
中。如果我再次删除它,它将从
globals()
中删除,但仍驻留在
sys.modules
中。为什么会这样

import mymodule
'mymodule' in globals()   # True
'mymodule' in sys.modules # True
del mymodule
'mymodule' in globals()   # False
'mymodule' in sys.modules # Still True, why?
我还发现了以下区别:

from mypackage import mymodule
'mypackage' in sys.modules            # True
'mymodule'  in sys.modules            # False !
'mypackage.mymodule' in sys.modules   # also True !
对于
globals()
,答案是互补的:


因为Python缓存模块是为了防止(昂贵、缓慢)的模块查找过程超出需要而运行

如果需要,可以从系统模块中删除模块,但也可以工作


更详细地说,当您导入mymodule时,会发生各种事情。假设
mymodule
不是解释器可执行文件中内置的模块之一:

  • 解释器运行一些复杂的代码来定位包含
    mymodule
    的文件(可能是
    mymodule.py
    mymodule.pyc
    ,或者
    mymodule.pyd
    ——或者是我没有想到的其他文件。这可以查看当前目录、sys.path和其他位置

  • 这样定位的文件经过词法分析和编译(如有必要)成解释器字节码

  • 执行编译后的模块,给出一个模块对象

  • 模块对象被插入到sys.modules中

  • 模块对象绑定到
    import
    语句中指定的局部变量

  • (根据我记忆中的
    import
    背后的机制,上面是一个非常粗略的近似值。它可能在重要和微妙的方面是错误的。)


    请注意,将模块对象绑定到本地名称实际上是实际导入过程的一小部分。通过执行
    del mymodule
    ,删除名称绑定不会影响导入的其余部分。

    与任何其他Python对象一样,模块会继续存在,直到不再有对它的引用为止r单词,
    sys.modules
    的行为类似于常规的dict,并且

    import mymodule
    lst = {mymodule.__name__: mymodule}
    'mymodule' in globals()   # True
    'mymodule' in lst         # True
    del mymodule
    'mymodule' in globals()   # False
    'mymodule' in lst         # Still True
    

    sys.modules
    仅在导入语句时被查阅。您可以从
    sys.modules
    中删除模块,使Python在下次导入时重新加载该模块。

    del
    删除适当范围内名称的绑定;它与模块本身无关


    sys.modules
    保留已加载的所有模块的列表,无论它们是否绑定到程序中的任何名称。

    可以从sys.modules中删除模块,
    del sys.modules['mymodule']
    ,这有时很有用。但是如果我通过执行
    del mymodule
    删除名称绑定,我会将其从名称空间中删除,以便执行
    import mymodule
    ,这两个步骤一起相当于执行
    重新加载(mymodule)
    ,对吗?@Hongbo:错:
    import
    首先在
    sys.modules
    中查看是否已经导入了模块。如果已经导入了,它只会给你上次导入模块时创建的模块对象。因为
    del mymodule
    不会从
    sys.modules
    中删除模块对象,所以重新导入它只需将名称重新绑定到
    sys.modules
    @Hongbo中的对象:如果您希望它重新导入模块,请执行
    reload(module)
    。等效地,将其从
    sys.modules
    中删除,然后导入它。非常感谢,Katriealex。您的回答帮助我解决了帖子中的难题
    import mymodule
    lst = {mymodule.__name__: mymodule}
    'mymodule' in globals()   # True
    'mymodule' in lst         # True
    del mymodule
    'mymodule' in globals()   # False
    'mymodule' in lst         # Still True