我有以下python代码,在我看来表现得很奇怪:
导入的模块:
# 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()
我希望这段代码可以打印出以下内容:
1--
1--
2--
2--
但我得到的是:
1--
1--
1--
1--
有人能指出我参考python参考的正确部分或解释为什么我没有得到预期的行为吗?
谢谢,
尤利安
答案 0 :(得分: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 guide,lowercase_with_underscores
是函数的首选命名方式,lowercase
是模块名称。
答案 1 :(得分:2)
当您执行from ChangeVar import *
时,您在主模块中创建一个名称Print
,引用当前在ChangeVar中设置的Print
。但这是一个指向同一函数的单独名称,因此调用Change
不会在主模块中更新它。
有两种方式围绕它:
import ChangeVar
然后拨打ChangeVar.Print()
。因为它使用ChangeVar中的名称,所以它受ChangeVar.Change()
的影响,正如@Lattyware所说。Print
,根据其他变量的设置,调用Print1
或Print2
。