何以python的function不支持把default argument放在non-default前面?

发布日期:2018-06-02 来源:财富国际在线 阅读:
何以python的function不支持把default argument放在non-default前面? 匿名用户 5小时前 65 python python函数 在这个例子中: def add(y=2,x): print(locals()) print(x) 解释器出错: def add(y=2,x): ^ SyntaxError: non-default argument follows default argument 很好奇为什么一个non-default argument为什么不能放在default之后。这样做有一个语言实现层面上的解释吗? (ps。为了避免有人牛角尖我把函数改成了2个变量)
0 0
其他回答
Python的函数参数绑定有两种方式:顺序绑定与关键字绑定。当使用顺序绑定时,必须从左到右指定参数,不能跳过已有的参数,否则没有办法判断这些参数究竟是传递给谁的。Python没有类型系统,不能根据传入参数的类型匹配相应的重载版本,而且说到底也根本不支持重载(而是支持可变参数)。最关键的是,即使可以指定一套规则允许可选参数在前,除了破坏代码可读性以外也没有什么实际的意义。一般来说,必选的参数必然比可选的参数重要,所以它在之前也是理所当然的事情。当我们看到func(a,b,c)和func(a,b)的时候,也会理所当然地认为省略的是最后一个参数,而不是原来的第一个参数。
在很少的情况下,由于参数位置有额外的数学上的习惯,比如range(start, [end]),当使用一个参数版本的时候,start其实是end。这可以很容易通过代码进行hack,当检测到只有一个参数的时候,将两个参数的值交换就行了。其他奇怪的参数顺序要求也可以这样实现。
灵剑 5小时前 0条评论
0 0
简单的来说把含有默认值的参数放在不含默认值的参数前边会有歧义。

举个例子:
add(3)会有两种含义:
1. 第一个参数y使用默认值所以省略,传入第二个参数的值。也就是y=2,x=3
2. 传入的2是第一个参数y的值,在这种情况下少一个参数,应该报错。

题主也许会说,把编译出错的情况忽略掉就可以了。
但是考虑下列情况:def add(y=1,z=2,x): pass
调用add(3,2)
得到的参数到底是y=1,z=3,x=2还是y=3,z=2,x=2?

所以你在任何正常的语言中都不会见到将含有默认值的参数放在不含默认值的参数前边的情况。
热心网民 5小时前 0条评论
0 0

关于我们 联系我们招聘信息免责申明广告服务 网站地图 百度地图 TAG标签

Copyright@2018-2022 Cfgjzx.Com 财富国际在线 版权所有 All Rights Reserved   
财富国际提供:最新财富资讯、房产资讯、股票资讯、区块链、投资理财、保险导购、健康产品、公私募基金,易经等资讯及服务.