2017-06-16 45 views
0

我懷疑我所遇到的Python的限制,但我只是想確認......在Python中,我可以在運行時更改函數中的全局變量嗎?

GLOBAL_VAR = "foo" 

def printVar(myVar=GLOBAL_VAR): 
    print myVar 

def changeVar(newVar): 
    global GLOBAL_VAR 
    GLOBAL_VAR = newVar 

printVar() 

OUTPUT: foo 

changeVar('bar') 
print GLOBAL_VAR 

OUTPUT: bar 

printVar() 

OUTPUT: foo  

爲什麼不是最後的輸出「吧」?

+0

你在哪裏定義了foo和bar(你正試圖OUTPUT:他們)?否則,你的代碼工作正常。這個程序的目的是什麼,你使用的是什麼版本的Python? –

回答

3

因爲賦值myVar=GLOBAL_VAR在定義函數時被評估 - 此時GLOBAL_VAR"foo"

你可以改變你的功能是這樣的:

def printVar(myVar=None): 
    if(myVar is None): 
     myVar = GLOBAL_VAR 
    print myVar 

這樣,它總是會打印GLOBAL_VAR

+1

如果OP想驗證這一點,他們可以使用'inspect.getargspec(printVar)' – Pythonista

+0

參見[Mutable Default Arguments](http://python-guide-pt-br.readthedocs.io/en/latest/writing/gotchas/) ) – TWReever

+0

這就是我所懷疑的。感謝您的確認! – KyleD

0

默認綁定時執行def語句完成的當前值 - 總之,當你第一次通過你的程序解析該行時。該值然後是「foo」,所以這是myVar的默認值。您可以更改GLOBAL_VAR,但該綁定仍然是,而不是對變量的引用。

如果要更改綁定,則需要再次執行def--換句話說,您必須重新定義該函數。

相關問題