假設我有一個Python函數foo
,它接受一個默認參數,其中默認參數設置爲某個全局變量。如果我現在在調用該函數之前更改該全局變量,則默認參數仍設置爲該全局變量的原始值。將默認參數定義爲全局變量
例如:
x = 1
def foo(a=x):
print a
x = 2
foo()
這將打印1
,代替2
。
我應該如何編寫我的代碼,以便我可以更改此全局變量,並讓它更新此默認參數?
假設我有一個Python函數foo
,它接受一個默認參數,其中默認參數設置爲某個全局變量。如果我現在在調用該函數之前更改該全局變量,則默認參數仍設置爲該全局變量的原始值。將默認參數定義爲全局變量
例如:
x = 1
def foo(a=x):
print a
x = 2
foo()
這將打印1
,代替2
。
我應該如何編寫我的代碼,以便我可以更改此全局變量,並讓它更新此默認參數?
默認變量僅評估和設置一次。因此,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
。
作爲the_deault您可以使用'None',除非None是參數的有效值 –
@CarloLobrano:是。我在你寫評論的同時更新了答案。唯一的問題可能是你想排除用戶自己可以提供該對象的事實。通過使用「the_object」這樣的東西,您可以更好地保護您免受這種行爲的侵害。 –
這是正確的。有時使用「默認對象」比無更明智 –
默認參數只被評估一次...... –