python import-ed变量保持相同的值,尽管它正在变化

时间:2012-02-05 20:05:29

标签: python variables

我有以下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参考的正确部分或解释为什么我没有得到预期的行为吗?

谢谢,

尤利安

2 个答案:

答案 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 guidelowercase_with_underscores是函数的首选命名方式,lowercase是模块名称。

答案 1 :(得分:2)

当您执行from ChangeVar import *时,您在主模块中创建一个名称Print,引用当前在ChangeVar中设置的Print。但这是一个指向同一函数的单独名称,因此调用Change不会在主模块中更新它。

有两种方式围绕它:

  • 您可以import ChangeVar然后拨打ChangeVar.Print()。因为它使用ChangeVar中的名称,所以它受ChangeVar.Change()的影响,正如@Lattyware所说。
  • 您可以创建一个函数Print,根据其他变量的设置,调用Print1Print2