看了官方文档的关键字与默认形参后,发现有几处迷惑之处。为什么默认形参和关键字的定义形式基本没有区别;为什么在keyword中不能参杂着position arguments。个人理解:是因为python的参数列表的随意性决定的。
如:
def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue')
这个函数,我们可以这样初始化:parrot(19),也可以parrot(19,state='',type=''),也可以parrot(19,type='',action='')来初始化一个实例。所以你无法在keyword中参杂一个position argument,因为编译器不知道它assign给哪一个值。比如:parrot(1,atate='','')后面的空串给谁?
在编译器中都是一视同仁的。
还有一个就是python定义函数时,如果默认对象是一个mutable object,那么它的函数运算就会和c系列有差异。python中的默认值只会初始化一次,并会存储起来。测试代码如下:
def f(a, L=[]): L.append(a) print(id(L)) return L print(f(1)) print(f(2)) print(f(3))
输出结果:
2347964374792 [1] 2347964374792 [1, 2] 2347964374792 [1, 2, 3]
这是mutable object那么换一个字面值常量呢?比如string
测试代码:
def f(a, L=""): print(id(L)) return L print(f(1)) print(f(2)) print(f(3))输出结果:2214607887024 2214607887024 2214607887024所以有理由相信编译器处理函数默认值是在堆中划一区域存储的,而不是在栈里。
最后keyword就是处理多个default argument时采用的特别名字。