鍍金池/ 問答/Python  HTML/ Python 3的可變參數(shù)和位置參數(shù)的問題

Python 3的可變參數(shù)和位置參數(shù)的問題

def f1(a, b, c=0, *args, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
    
    
args = (1, 2, 3, 4)
kw = {'d': 99, 'x': '#'}
f1(*args, **kw)

結(jié)果為 a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}

這里我認為應該報錯理由如下
a, b, c是位置參數(shù),args是可變參數(shù),*kw是關(guān)鍵字參數(shù)。代碼

f1(*args, **kw)

只是傳遞了可變參數(shù)和關(guān)鍵字參數(shù),并沒有傳a,b,c這三個位置參數(shù)。所以以我的理解程序應該報錯才對,但事實并不是這樣。還請大神指教啊

回答
編輯回答
綰青絲

所謂可變參數(shù)和位置參數(shù)是一個東西,python里其實只有兩種類型的參數(shù)。你向f1函數(shù)傳的*args參數(shù)的*就是按順序展開args里的東西作為位參數(shù)的意思,而f1的參數(shù)表為(a, b, c, *args, **kw),a, b, c“捕獲”到了1, 2, 3*args則捕獲到了剩余的參數(shù)4, ,沒有任何問題。當然這都只是人為的規(guī)定,你要規(guī)定說使用*展開的參數(shù)是第三種類型的參數(shù)也行,但這樣你就要用另一種表達式替代原本的星號表達式以展開位置參數(shù),而且你還要自己去改python源碼

2017年2月12日 16:26