2012-02-05 53 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