python函数传字典参数时解包后因为含有与其他形参同名的key而导致的 TypeError: func() got multiple values for argument ‘a‘ 重复赋值错误

文章讲述了在Python中如何正确使用函数参数,强调了形参`a`后面添加`/`来防止与解包后的`a=1`冲突,以及`*`和`**kargs`的用法,分别用于接收位置参数和关键字参数。同时,提到了直接传入字典给`**kargs`是错误的做法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

b = {'a':1,'b':2}

def func (a,**kargs):
    print(a)
    print(kargs)

func(1,**b)

这是不对的,b的key中有'a',解包(unpack)后相当于 a = 1, b = 2,与第一个形参重名而重复赋值。

正确的方法如下,密切关注函数定义的 / 

b = {'a':1,'b':2}

def func (a,/,**kargs):
    print(a)
    print(kargs)

func(1, **b)
1
{'a': 1, 'b': 2}

因为在参数a的后面加入/,这是让形参a只接受位置参数而不接受解包后产生的 a = 1 关键字参数,从而不会重复赋值。同样的还有 * ,在*后的参数相反,只接受关键字参数,如如下定义

def func (pos_only, /, standard, *, kwd_only):
    
    print(pos_only, standard, kwd_only)

 顺便的,对**kargs直接传入键值对是正确的,如

def func (c , **kargs):
    pass

func(1, a = 1 , b = 1)

 也可以传入解包后的字典实参

func(1, **{'a':1,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值