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

时间:2015-01-21 19:38:53

标签: python import

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

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

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


#mod2.py
from mod1 import *  #This may not be a good coding practice, but it's relevant to my question
print "var1="+str(var1)
test()
print "var1="+str(var1)

执行mod2时,print语句打印:

var1=None
var1=None

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


#mod2.py
import mod1
print "var1="+str(mod1.var1)
mod1.test()
print "var1="+str(mod1.var1)

第一个和第二个打印报表打印:

var1=None
var1=1

表示通过调用mod1.test()来改变var1的值。

为什么会这样?

1 个答案:

答案 0 :(得分:0)

一个常见的类比是想到与气球相关的字符串。将每个赋值语句都想象为将字符串绑定到气球上​​。 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

在第一个版本(from mod1 import *)中,您基本上会执行一大堆赋值语句:

var1 = mod1.var1
...

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

在第二个示例(import mod1)中,您有一个与mod2.mod1 模块绑定的字符串(mod1),但没有明确的字符串绑定到{ {1}}。所以现在当你重新绑定mod1.var1字符串时,你仍然可以用同样的方式查找它 - 绑定到mod1.var1的字符串没有变化,只有mod1mod1的字符串mod1.var1