关于python函数参数的传递*args, **kwargs的区别及用法
1,区别:在 python 中,*args 和 **kwargs 都代表 1个 或 多个 参数的意思。*args 传入tuple 类型的无名参数(无法修改),而 **kwargs 传入的参数是 dict 类型(可以修改)。
2,举个栗子
-
1,*args的用法
def list1(*args): print(args) for i in args: print(i) print("*args end") if __name__ == '__main__': a = [1,2,3,4,5] # 使用不同的方式传入参数 list1(1,2,3,4,5) list1(a) list1(*a)
-
输出结果:
(1, 2, 3, 4, 5) 1 2 3 4 5 *args end ([1, 2, 3, 4, 5],) [1, 2, 3, 4, 5] *args end (1, 2, 3, 4, 5) 1 2 3 4 5 *args end
-
分析,我们可以看到,第一种方法和第三种方法传入参数的结果时一致性的,都转化为了元组,而第二种传递方法,只是将传入列表,变为元组一项,说明,每个传入的参数(参数列表逗号分隔)都将转化为*args元组的其中一项,如果要传入一个列表。可以使用第三种方式传入(在列表或者元组名前面加*)。
-
2,**kwargs的用法
def list2(**kwargs): print(kwargs) kwargs[0] = 1 print(kwargs.keys()) if __name__ == '__main__': b = { "key1": 1, "host": '127.0.0.1', } list2(**b) list2(key1=1, host="127.0.0.1")
-
输出结果:
{'key1': 1, 'host': '127.0.0.1'} dict_keys(['key1', 'host', 0]) {'key1': 1, 'host': '127.0.0.1'} dict_keys(['key1', 'host', 0])
-
分析,输出结果一至,并且**kwargs可以修改。
-
注意:如果给list2直接传入b是会报错的因为**kwargs接收的参数是键值对,要给出键和值,或者使用第一种方法传入整个字典,而不是单纯的传入一个单一的值,这样参数列表会优先匹配单个值的普通参数,或者*args参数,当没有这样的参数时会报错
-
如果使用下面这种方式:
list2(b=b)
-
会输出:
{'b': {'key1': 1, 'host': '127.0.0.1'}} dict_keys(['b', 0])
-
字典b将作为键b的值