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)
结果为 a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}
这里我认为应该报错理由如下
a, b, c是位置参数,args是可变参数,*kw是关键字参数。代码
f1(*args, **kw)
只是传递了可变参数和关键字参数,并没有传a,b,c这三个位置参数。所以以我的理解程序应该报错才对,但事实并不是这样。还请大神指教啊
所谓可变参数和位置参数是一个东西,python里其实只有两种类型的参数。你向
f1
函数传的*args
参数的*
就是按顺序展开args
里的东西作为位参数的意思,而f1
的参数表为(a, b, c, *args, **kw)
,a, b, c
“捕获”到了1, 2, 3
,*args
则捕获到了剩余的参数4,
,没有任何问题。当然这都只是人为的规定,你要规定说使用*
展开的参数是第三种类型的参数也行,但这样你就要用另一种表达式替代原本的星号表达式以展开位置参数,而且你还要自己去改python源码