2012-02-05 64 views
3

我有以下Python代码这在我看来很奇怪的行为:蟒蛇进口ED变量保持相同的值,但它正在改变

进口模块:

# ChangeVar.py 
def Print1(): 
    print "1--" 

def Print2(): 
    print "2--" 

Print=Print1 

def Change(): 
    global Print 
    Print=Print2 

主要模块:

#UseVar.py 
from ChangeVar import * 

Print() 
Print() 

Change() 


Print() 
Print() 

我希望这个代码打印follwing:

1-- 
1-- 
2-- 
2-- 

但我得到的却是:

1-- 
1-- 
1-- 
1-- 

可能有人点我的蟒蛇参考的右侧部分或解释为什么我没有得到预期的行为?

感谢,

尤利安

回答

2

Python的global是全球仅模块。

import ChangeVar 

ChangeVar.Print() 
ChangeVar.Print() 

ChangeVar.Change() 

ChangeVar.Print() 
ChangeVar.Print() 

这将工作,但是,重新考虑global您的使用 - 这是普遍不好的做法。应该有一个更干净的方式来做你想做的事情。考虑在你的模块中使用一个类。

# ChangeVar.py 
class ChangeVar(object): 
    def __init__(self): 
     self.Print=self.Print1 

    def Print1(self): 
     print "1--" 

    def Print2(self): 
     print "2--" 

    def Change(self): 
     self.Print=self.Print2 

用作这样:

#UseVar.py 
from ChangeVar import ChangeVar 

cv = ChangeVar() 
cv.Print() 
cv.Print() 

cv.Change() 

cv.Print() 
cv.Print() 

我也想指出,根据Python style guidelowercase_with_underscores是功能模块名称首选的命名风格,和lowercase

+0

我愿意接受任何建议,我很欣赏向我展示更清洁的方式。确切地说:'Print'是一个日志记录功能,应该简单地用函数名称('Print' - 而不是'Module.Print')来调用 – INS 2012-02-05 20:22:30

+1

@INS首先,我会推荐一个描述性名称 - 日志将是适当的,不与内部冲突。为什么你需要在不指定名称空间的情况下调用它?通常将这些事情分开是个好主意。 – 2012-02-05 20:28:49

2

当你做from ChangeVar import *时,你在你的主模块中创建一个名称Print,指出当前在ChangeVar中设置了哪些Print。但这是一个单独的名称,指向相同的功能,所以在主模块中调用Change不会更新它。

有两种方法围着它

  • 你可以做import ChangeVar,然后调用ChangeVar.Print()。因为它使用ChangeVar中的名称,所以它受到ChangeVar.Change()的影响,正如@Lattyware所说。
  • 您可以创建一个函数Print,该函数调用Print1Print2,具体取决于其他变量设置为的值。
+0

我可能会结束一个变量... – INS 2012-02-05 20:26:16