Python 已加载模块的导入行为

Python 已加载模块的导入行为,python,Python,鉴于这种情况: Foo.py: import another_module def foo(): #some code 它由不同的模块调用,其中一些模块已经导入了另一个模块,而另一些模块则没有(让我们将其中一个模块称为“main.py”) 默认行为是什么?模块重新加载了吗?如果是的,(这只是好奇),让我们假设另一个模块在main中的导入和foo.py中的导入之间发生了更改。Python内存中确实有两个不同版本的另一个_模块,一个可用于foo.py,另一个可用于main.py 如果已在主中导入

鉴于这种情况:

Foo.py:

import another_module

def foo():
#some code
它由不同的模块调用,其中一些模块已经导入了另一个模块,而另一些模块则没有(让我们将其中一个模块称为“main.py”)

  • 默认行为是什么?模块重新加载了吗?如果是的,(这只是好奇),让我们假设另一个模块在main中的导入和
    foo.py中的导入之间发生了更改。Python内存中确实有两个不同版本的
    另一个_模块
    ,一个可用于
    foo.py
    ,另一个可用于
    main.py
  • 如果已在
    中导入另一个模块,是否有方法不导入该模块
  • 如果主要是从另一个模块导入f1,而在foo.py
    中从另一个模块导入f1,f2
    ,它是如何工作的。f2只是“添加”了还是重新加载了模块

  • 不,模块不会重新加载。您可以使用该功能重新加载模块。导入模块后,将其添加到字典中。如文档所述,您还可以通过更改此变量的内容来强制重新加载模块:

    这可以被操纵来强制重新加载模块和其他技巧。请注意,从该字典中删除模块与对相应的模块对象调用reload()不同

    关于这种行为,声明没有任何区别。它只控制加载模块的哪些部分被添加到当前作用域:

    Import语句分两步执行:(1)找到一个模块,必要时对其进行初始化;(2) 在本地命名空间中定义一个或多个名称(import语句发生的范围)。该语句有两种形式,即是否使用from关键字。第一个表单(不带from)对列表中的每个标识符重复这些步骤。具有from的表单执行步骤(1)一次,然后重复执行步骤(2)

    您可以自己轻松验证这一点:

    y.py

    print "Y"
    
    def f1():
        pass
    
    def f2():
        pass
    
    print "X"
    
    from y import f1, f2
    
    from y import f1
    
    import x
    
    print "reload"
    
    reload(x)
    
    x.py

    print "Y"
    
    def f1():
        pass
    
    def f2():
        pass
    
    print "X"
    
    from y import f1, f2
    
    from y import f1
    
    import x
    
    print "reload"
    
    reload(x)
    
    测试.py

    print "Y"
    
    def f1():
        pass
    
    def f2():
        pass
    
    print "X"
    
    from y import f1, f2
    
    from y import f1
    
    import x
    
    print "reload"
    
    reload(x)
    
    python test.py


    我同时补充了一个问题