关于python带默认值的参数只能放在后面的问题

python函数带默认值的参数应该放在后面,碰到如下问题:为什么下面这个函数可以这么定义()deffun(*x,y=4,z):print(x)print(y)print(... python函数带默认值的参数应该放在后面,碰到如下问题:
为什么下面这个函数可以这么定义()
def fun(*x, y=4, z):
print(x)
print(y)
print(z)
而下能这个函数不能这么定义
def fun(x=4, y):
print(x)
print(y)
展开
 我来答
直角世界的博客
2019-09-02 · TA获得超过106个赞
知道小有建树答主
回答量:91
采纳率:89%
帮助的人:36.4万
展开全部
第一个那个*x是*args的意思,就是任意个参数,C++里的 va_arg,...符号这种,python函数里可以有*args和**kwargs。
*args之后可以随便放有默认值的和没有默认值的。
因为这之后的任何东西都得用”y=1“”z=1“这种来赋值。
比如说第一个函数,def fun(*x, y=4, z),我写fun(1,2,3,4,5),这五个数全跑到*x里了。我想给y和z赋值必须要写fun(1,2,3,4,5,y=6,z=7)。相当于z跟有默认值的那种也差不多了。所以规定可以把z放在*x后面的任何位置,包括y=4后面,它们的位置关系已经没有用了。
规定def fun(x=4, y) y必须放在x前,就是要保留这种位置关系,要不我写fun(1),你说这个1是给x的还是y的?就有了歧义。所以必须要有正确的位置关系。但是*x后面所有东西都是用参数名赋值的,位置关系不起作用了,所以可以任意顺序了。
要理解规定背后的原因。同理,**kwargs放在最后,也是这个原因。消除歧义性。
hy1397471
2019-09-02 · 知道合伙人软件行家
hy1397471
知道合伙人软件行家
采纳数:4714 获赞数:17154
15年数据库维护及数据库应用系统开发经验,从事零售业、服务业及财务管理类系统开发与维护。

向TA提问 私信TA
展开全部
系统检查机制就是这样的,
假设允许你这样写,那么fun(2)中的2你要传给x还是y呢?解释器就没有办法判断,会有歧义,因为x是可以省略不传值,那么2有可能传给x,也有可能传给y。
第一种虽然可以通过语法检查(应该是*参数影响了原本的验证),也不建议这样使用,你自己试试传值,就知道了。
追问
1
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式