关于python函数参数的传递*args, **kwargs的区别及用法(实例)

关于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的值

原文地址:https://www.cnblogs.com/jlxa162hhf/p/14161227.html