在 Python3.8 的官方文档中的 4.7.3.4 的一个示例中:
摘自原文:
最后,请考虑这个函数定义,它的位置参数 name 和 **kwds 之间由于存在关键字名称 name 而可能产生潜在冲突:
def foo(name, **kwds):
return 'name' in kwds
任何调用都不可能让它返回 True,因为关键字 'name' 将总是绑定到第一个形参。
起初并不太理解这个函数,为什么说“任何调用都不可能让它返回 True”。
在学习了 * 和 ** 的函数调用时的解包时,才明白。
如果函数按如下方式调用的话:
foo(1,**{'name':2})
粗劣一看,name 应该在 kwds 参数中,但实际上在 {'name':2} 被解包之后,就变成了 name = 2
这时候,形参 name 先被赋值了 1,现在又赋值成 2,多次赋值会直接报错。若字典中不包含 name 则不报错,但是那样子就没办法满足 'name' in kwds 这个条件,也就无法返回 Ture