Python导入和fromx导入。他们之间的真正区别是什么?

Python导入和fromx导入。他们之间的真正区别是什么?,python,Python,我读了另外两个关于它的问题。 但我不明白这种行为: #mod1 __init__.py g = 5 #mod2 __init__.py from mod1 import g def bar(): print g #main1.py import mod1 mod1.g = 10 from mod2 import bar bar() # prints 10 #main2.py from mod1 import g g = 10 from mod2 import bar bar()

我读了另外两个关于它的问题。

但我不明白这种行为:

#mod1 __init__.py
g = 5

#mod2 __init__.py
from mod1 import g
def bar():
    print g

#main1.py
import mod1
mod1.g = 10
from mod2 import bar
bar() # prints 10

#main2.py
from mod1 import g
g = 10
from mod2 import bar
bar()

所以问题是为什么main1打印10,main2打印5?“从导入”和“导入”之间的真正区别是什么?

这与范围有关

mod2进口mod1 g=5

main1将mod1.g设置为10,并要求mod2打印mod1.g的值

main2将main2.g设置为10,但mod1.g保持不变

关键是在main1中,您将模块mod1中的变量g设置为10,因此调用条返回10。我想这很清楚。 在main2中,您首先将g设置为10,但当mod2导入mod1时,它将获得一个新的范围,其中包含一组初始变量。在调用mod2之后,尝试在main2中打印g,我猜它将打印更改后的值10


您必须记住,导入只是告诉解释器查找相应模块中调用的任何内容,就好像您要再次打开脚本一样。当然,当程序更改变量时,分配给变量的值在脚本中不会更改。解释器只读取一次.py文件,而对于您的情况,则在导入时再次读取。

谢谢。所以main1使用对mod1.g的引用,main2使用mod1.g的副本,对吗?通过从mod1导入g,g=10实际上是指mod1main2中定义的变量不使用副本。它只是创建了一个新变量,gi尝试了打印5。从mod1导入g从mod2导入条g=10