2017-03-10 65 views
3

假設我有一個Python函數foo,它接受一個默認參數,其中默認參數設置爲某個全局變量。如果我現在在調用該函數之前更改該全局變量,則默認參數仍設置爲該全局變量的原始值。將默認參數定義爲全局變量

例如:

x = 1 

def foo(a=x): 
    print a 

x = 2 
foo() 

這將打印1,代替2

我應該如何編寫我的代碼,以便我可以更改此全局變量,並讓它更新此默認參數?

+0

默認參數只被評估一次...... –

回答

4

默認變量僅評估和設置一次。因此,Python製作了參考文獻,從那以後,它始終將該參考作爲默認值傳遞。沒有重新評估。

但是,您可以通過使用另一個對象作爲默認對象來解決此問題,然後使用if語句來相應地替換它。喜歡的東西:

the_default = object() 
x = 1 

def foo(a = the_default): 
    if a is the_default: 
     a = x 
    print a 

x = 2 
foo()

注意,我們使用is執行參考平等。所以我們檢查它是否確實是default_object。您不應該在代碼中的其他地方使用the_default對象。

在許多Python代碼中,它們使用None作爲默認值(從而減少構造對象的數量)。例如:

def foo(a = None): 
    if a is None: 
     a = x 
    print a

不過請注意,如果你這樣做,你的程序不能進行調用foo()foo(None)而使用的東西作爲the_object就更難用戶獲取對對象的引用的用戶之間的區別。如果None也是有效的候選人,這可能會有用:如果您希望foo(None)打印'None'而不是x

+0

作爲the_deault您可以使用'None',除非None是參數的有效值 –

+1

@CarloLobrano:是。我在你寫評論的同時更新了答案。唯一的問題可能是你想排除用戶自己可以提供該對象的事實。通過使用「the_object」這樣的東西,您可以更好地保護您免受這種行爲的侵害。 –

+1

這是正確的。有時使用「默認對象」比無更明智 –