变量作用域如何与python导入一起工作

变量作用域如何与python导入一起工作,python,import,Python,Import,我很难理解一个模块中的全局变量实际上是如何导入到另一个模块中的。假设我们有一个模块mod1.py,编码如下: #mod1.py var1 = None def test(): global var1 var1=1 另一个模块mod2.py打算使用mod1.py,如下所示: #mod1.py var1 = None def test(): global var1 var1=1 执行mod2时,print语句将打印: var1=None var1=None

我很难理解一个模块中的全局变量实际上是如何导入到另一个模块中的。假设我们有一个模块mod1.py,编码如下:

#mod1.py
var1 = None
def test():
    global var1
    var1=1

另一个模块mod2.py打算使用mod1.py,如下所示:

#mod1.py
var1 = None
def test():
    global var1
    var1=1


执行mod2时,print语句将打印:

var1=None
var1=None
var1=None
var1=1

这意味着由于“from mod1 import*”而导入的var1的值在mod2中没有通过调用test()进行任何更改。另一方面,如果我将mod2编码如下:

#mod1.py
var1 = None
def test():
    global var1
    var1=1


第一个和第二个打印语句打印:

var1=None
var1=None
var1=None
var1=1

这意味着通过调用mod1.test()更改了var1的值


为什么会这样?

一个常见的类比是把绳子系在气球上。可以将每个赋值语句看作是将字符串绑定到气球上。e、 g

a = 1  # tie a string "a" to the `1` balloon
b = a  # tie a string to the same balloon that "a" is tied to.
为现有变量分配新内容类似于剪切当前字符串并将其绑定到其他内容:

a = 2  # cut string tying "a" to 1 and tie it to the `2` balloon
在第一个版本中(
来自mod1 import*
),您基本上执行了一系列赋值语句:

var1 = mod1.var1
...
现在,有两个字符串绑定到1气球--
mod1.var1
mod2.var1
。调用
test
函数后,剪切
mod1.var1
的字符串并将其绑定到“2”气球上


在第二个示例(
import mod1
)中,有一个字符串(
mod2.mod1
)绑定到
mod1
模块,但没有显式字符串绑定到
mod1.var1
)。因此,现在当您重新绑定
mod1.var1
字符串时,您仍然可以以相同的方式查找它-绑定到
mod1
的字符串没有更改,只有从
mod1
mod1.var1
的字符串要添加到答案中,请尝试将mod2调高一点。从mod1导入*中获取
,然后执行
test()
。然后在
导入mod1
中添加一行,然后是
打印mod1.var1
。您将看到
mod1.var1
反映了新的值。感谢大家的解释。使用“from mod1 import*”,如果在调用test()之后,我再次执行“from mod1 import*”,mod2中的var1将被设置为mod1.var1的更新值,即1(不是无)。这一切对我来说都有意义。