Python中 *args 和 **kwargs 的区别

先来看个例子:

def foo(*args, **kwargs):
    print 'args = ', args
    print 'kwargs = ', kwargs
    print '---------------------------------------'

if __name__ == '__main__':
    foo(1,2,3,4)
    foo(a=1,b=2,c=3)
    foo(1,2,3,4, a=1,b=2,c=3)
    foo('a', 1, None, a=1, b='2', c=3)

输出结果如下:

args =  (1, 2, 3, 4) 
kwargs =  {} 
--------------------------------------- 
args =  () 
kwargs =  {'a': 1, 'c': 3, 'b': 2} 
--------------------------------------- 
args =  (1, 2, 3, 4) 
kwargs =  {'a': 1, 'c': 3, 'b': 2} 
--------------------------------------- 
args =  ('a', 1, None) 
kwargs =  {'a': 1, 'c': 3, 'b': '2'} 
---------------------------------------
可以看到,这两个是python中的可变参数。*args 表示任何多个无名参数,它是一个tuple;**kwargs 表示关键字参数,它是一个dict。并且同时使用*args和**kwargs时,必须*args参数列要在**kwargs前,像foo(a=1, b='2', c=3, a', 1, None, )这样调用的话,会提示语法错误“SyntaxError: non-keyword arg after keyword arg”。

在使用*args时要注意,在一个函数里面如果既有确定参数,又有不确定参数时(元组类型的不确定参数),调用函数时,给确定参数赋值,不能用"=",否则会报错。
In [1]: def test(a,b,c=100,*args):
   ...:     print "a:",a
   ...:     print "b:",b
   ...:     print "c:",c
   ...:     for i in args:
   ...:         print "i:",i
   ...:         

In [2]: test(20,10,50,200,300,400)
a: 20
b: 10
c: 50
i: 200
i: 300
i: 400

In [3]: test(b=20,a=10,c=50,200,300,400)
  File "<ipython-input-3-b174f70470b5>", line 1
    test(b=20,a=10,c=50,200,300,400)
SyntaxError: non-keyword arg after keyword arg

可以不给不确定参数赋值:
In [4]: test(b=20,a=10,c=50)
a: 10
b: 20
c: 50

如果是字典类型的不确定参数,可以用"="赋值:
In [10]: def test(a,b,c=200,**kwargs):
   ....:     print "a:",a
   ....:     print "b:",b
   ....:     print "c:",c
   ....:     for value in kwargs:
   ....:         print "%s:%s"%(value,kwargs[value])
   ....:         

In [11]: test(b=20,a=10,c=100,mm=20,nn=10,xsk=1)
a: 10
b: 20
c: 100
mm:20
xsk:1
nn:10

也可以用下面的形式:

In [26]: def test(arg1,arg2,arg3):
   ....:     print "arg1:",arg1
   ....:     print "arg2:",arg2
   ....:     print "arg3:",arg3
   ....:     

In [27]: args = ["two",1]

In [28]: test(2,*args)
arg1: 2
arg2: two
arg3: 1


In [40]: def test(a1,a2,a3):
   ....:     print "a1:",a1
   ....:     print "a2:",a2
   ....:     print "a3:",a3
   ....:     

In [41]: kwargs = {"a3":"you","a2":"love"}

In [42]: test("i",**kwargs)
a1: i
a2: love
a3: you


原文地址:https://www.cnblogs.com/nyist-xsk/p/8257376.html