一、Python的function不支持把default argument放在non-default前面的原因
在 Python 中,函數(shù)的參數(shù)可以設置默認值,這使得函數(shù)調(diào)用時可以省略某些參數(shù)。但是,Python 不允許將默認參數(shù)放在非默認參數(shù)之前的原因與默認參數(shù)的實現(xiàn)方式有關(guān)。
在 Python 中,函數(shù)的參數(shù)都是通過名稱來傳遞的,即關(guān)鍵字參數(shù)。當函數(shù)有多個參數(shù)時,Python 解釋器無法確定每個關(guān)鍵字參數(shù)所對應的值到底是哪個參數(shù)的值。因此,Python 只允許將默認參數(shù)放在參數(shù)列表的最后面。
如果 Python 允許將默認參數(shù)放在參數(shù)列表的中間或前面,那么在調(diào)用該函數(shù)時就會出現(xiàn)歧義。例如,假設我們有一個函數(shù) foo,它有三個參數(shù),其中第二個參數(shù)有默認值:
def foo(a, b=10, c):
pass
在調(diào)用 foo 函數(shù)時,如果只指定了名列前茅個參數(shù) a 和第三個參數(shù) c 的值,那么 Python 解釋器無法確定這兩個值分別對應哪個參數(shù)。因此,Python 不支持將默認參數(shù)放在非默認參數(shù)之前。
為了避免這種歧義,如果需要將默認參數(shù)放在參數(shù)列表的中間或前面,可以使用關(guān)鍵字參數(shù)來明確指定參數(shù)的值,例如:
def foo(a, c, b=10):passfoo(a=1, c=2) # 等價于 foo(1, 2, 10)
在這個例子中,我們將默認參數(shù) b 放在了參數(shù)列表的最后面,但是在調(diào)用函數(shù)時我們可以使用關(guān)鍵字參數(shù)來指定參數(shù)的值,從而避免了歧義。