Python 3的可变参数和位置参数的问题

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这三个位置参数。所以以我的理解程序应该报错才对,但事实并不是这样。还请大神指教啊

阅读 3.7k
1 个回答

所谓可变参数和位置参数是一个东西,python里其实只有两种类型的参数。你向f1函数传的*args参数的*就是按顺序展开args里的东西作为位参数的意思,而f1的参数表为(a, b, c, *args, **kw)a, b, c“捕获”到了1, 2, 3*args则捕获到了剩余的参数4, ,没有任何问题。当然这都只是人为的规定,你要规定说使用*展开的参数是第三种类型的参数也行,但这样你就要用另一种表达式替代原本的星号表达式以展开位置参数,而且你还要自己去改python源码

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题