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