You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用**kwargs定义函数传入字典报错:most_courses()不接受位置参数却传入1个

为什么**kwargs没法直接接收传入的字典?

嘿,这个问题其实是对Python里**参数的用法有点小误解,咱们一步步理清楚:

首先看你的错误提示:most_courses() takes 0 positional arguments but 1 was given,原因很简单——你调用函数的时候传了一个位置参数(那个字典),但你的函数定义里**diction是用来接收关键字参数**并自动打包成字典的,它本身不接收位置参数,所以Python就报错啦。

你现在的代码问题在哪?

你的函数定义:

def most_courses(**diction):
    for key, value in diction.items():
        print("{} {}".format(key,value))

这里的**diction是告诉Python:“把所有传入的关键字参数(比如Andrew=['x','y']这种)打包成一个字典,名字叫diction”。

但你调用的时候是直接传了一个字典:

most_courses({'Andrew Chalkley': ['jQuery Basics', 'Node.js Basics'],'Kenneth Love': ['Python Basics', 'Python Collections']})

这时候Python会把这个字典当成一个单独的位置参数传给函数,但函数没定义任何位置参数,所以就触发了那个报错。

两种解决方法:

方法1:调用时用**解包字典

如果你想保留函数的**kwargs定义,那调用的时候要在字典前面加**,告诉Python“把这个字典里的键值对拆成关键字参数传进去”:

instructors = {'Andrew Chalkley': ['jQuery Basics', 'Node.js Basics'],'Kenneth Love': ['Python Basics', 'Python Collections']}
most_courses(**instructors)

这样函数里的diction就会接收到正确的字典,正常遍历打印。

方法2:修改函数定义为接收普通字典参数

如果你的需求本来就是直接传一个字典进去,那没必要用**kwargs,直接定义成普通参数就行:

def most_courses(diction):
    for key, value in diction.items():
        print("{} {}".format(key,value))

这时候原来的调用代码就可以正常运行了,不需要加任何前缀。

简单总结下:**在函数定义里是“打包关键字参数为字典”,在函数调用里是“解包字典为关键字参数”,两者要配合使用哦~

内容的提问来源于stack exchange,提问作者Sky Nam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:32:19