x = ('a','b','c','d')
y = {'a':1,'b':2,'c':3}
def func(a, b, args, c=0, **kw):
print a
print b
print args
print 'c =', c
print kw
func(1,2,x,3,**y)
上面这种情况才会出现以下提示:TypeError: func() got multiple values for keyword argument 'a'因为**y入参相当于会把y拆分为 a=1, b=2, c=3,由于前面定义时已经有一个变量名字同样叫a,所以才会提示多重赋值的提示
若是这种情况:
x = ('a','b','c','d')
y = {'a':1,'b':2,'c':3}
def func(a, b, args, c=0, *kw):
print a
print b
print args
print 'c =', c
print kw
func(1,2,x,3,*y)
输出如下:
1
2
('a', 'b', 'c', 'd')
c = 3
('a', 'c', 'b')
也很好理解,*kw表示接受可变参数,也就是元组,可是因为y是个dict而不是tuple,所以在调用func时,*y相当于只把y中的索引传了进去。因此,最后的kw输出是('a', 'c', 'b'),然而顺序为什么是acb而不是abc我也没搞懂。。
还有一种情况:
x = ('a','b','c','d')
y = {'a':1,'b':2,'c':3}
def func(a, b, args, c=0, *kw):
print a
print b
print args
print 'c =', c
print kw
func(1,2,x,3, **y)
错误提示如下:TypeError: func() got multiple values for keyword argument 'a'一样的,func接收可变个参数,然而**y这种入参形式就是错误的,*kw可以接受tuple类型输入,**y相当于输入是个dict,所以就算把y的索引改为d,e,f也依然会提示错误:
TypeError: func() got an unexpected keyword argument 'e'
总之呢,函数定义**y就是接收dict类型参数,*y是接收tuple类型参数,对于dict类型变量,可以用**x当做dict类型参数传入函数,而tuple类型可用*x。
接触python不深,还是大学汪,不知道以上理解对不对,请各位不吝指正。
参考网址:http://t.cn/8kUYJqN