Python中**kwargs传参异常及修改后传递生效问题咨询
关于Python *args和**kwargs的两个问题解答
问题1:直接传入字典为何被纳入args而非kwargs?
Python里的**kwargs只会收集两类参数:
- 显式以
key=value形式传入的关键字参数 - 用
**前缀展开字典后得到的键值对
你直接把完整字典作为参数传给firstFunc时,它就是一个普通的位置参数,和列表、整数这类参数没有区别,自然会被*args收集进去,**kwargs因此为空。
如果要让字典被**kwargs接收,必须在传参时加上**前缀,把字典展开成关键字参数:
firstFunc([1, 2], **{'firstFirst': 'firstFirst', 'first' : '123', 'second' : '999'})
问题2:为何在firstFunc中用**kwargs传递给secondFunc能被识别?
核心在于调用secondFunc时用了**语法——这个语法的作用是把字典里的键值对展开成独立的关键字参数传入函数。
你当前的代码里,firstFunc最初的kwargs其实是空的(因为调用它时没加**,字典进了args),但你执行kwargs['second'] = 222后,给空字典加了键值对,接着用**kwargs把这个字典展开成关键字参数传给secondFunc,所以secondFunc的**kwargs能收集到这些键值对。
如果要让firstFunc接收最初传入的字典并传递给secondFunc,可以先从args里取出字典再展开:
def firstFunc(*args, **kwargs): # 取出args中的字典 input_dict = args[1] # 展开字典传给secondFunc secondFunc([1, 2], **input_dict)
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

