2014-11-06 48 views
0

今天我在与Python模块混战,并且发现了一些有趣的东西;假设你有一个这样的模块:与其他模块操作的Python模块

# mymodule 

value = "default" 

def setVal(new): 
    value = new 

def getVal(): 
    return value 

现在,你有另一个模块导入mymodule。当你在Python shell中运行的模块,这种情况发生:

>>> moduleC.setC("newvalue") 
>>> moduleC.getC() 
'default' 
>>> moduleC.Cval = "new value" 
>>> moduleC.getC() 
'new value' 

为什么使用功能不能正常工作设置模块中的变量的值,但使用“=”不分配呢?

+1

@TerryJanReedy在下面的答案中说得很好 - 在Python中,'setVal()'和'getVal()'都不是必须的。如果在模块级别声明了值,则可以使用“MyModule.value”访问它,并根据需要进行更改。 Python不是Java :) – MattDMo 2014-11-06 03:34:43

回答

0

在你的setVal中,value对函数是局部的,当函数返回时会'消失'。要使其成为模块的全局,您必须声明它。这会按照你的希望进行,尽管它是不必要的(就像getVal())一样。

def setVal(new): 
    global value 
    value = new 
0

你可以运行下面的代码,看看发生了什么

value = 123 

def setVal(new): 
    value = new 
    print globals() 
    print locals() 

def getVal(): 
    return value 


setVal(22222) 
print getVal() 

然后:

value = 123 

def setVal(new): 
    global value 
    value = new 
    print globals() 
    print locals() 

def getVal(): 
    return value 


setVal(22222) 
print getVal() 

编辑:如果你想使用全局变量value在你的方法,只是宣布你想使用的只是全球性的,而不是新创建的。如果不是,则会创建一个名为value的局部变量,然后有两个变量,名为value - 全局变量(123)和本地变量(等于新参数)。

+0

介绍一下发生了什么? – MattDMo 2014-11-06 03:26:02

+0

@MattDMo见我的编辑。 – tianwei 2014-11-06 03:28:16