1.函数参数定义的顺序:必选参数(位置参数)、默认参数、可变参数、关键字参数、命名关键字参数
2.默认参数
(1)即,传的参数里面有默认值,可以通过传参替换;
(2)当有多个默认参数时,调用的时候,既可以按顺序提供,比如函数原定义enroll(name,sex,age=18,city="Beijing"),调用时可以enroll('Bob', 'M', 7),意思是,除了name,sex这两个参数外,最后1个参数应用在参数age上,city参数由于没有提供,仍然使用默认值;也可以不按顺序提供部分默认参数,但需要把参数名写上。如调用enroll('Adam', 'M', city='Tianjin'),意思是,city参数用传进去的值,其他默认参数继续使用默认值;
(3)但是会出现一个坑,如下:
def f(L=[]):
L.append("aaa")
return L
#正常调用,正常
print(f([1, 2, 3])) # [1, 2, 3, 'aaa']
#开始使用默认参数,首次正常
print(f()) # ['aaa']
#再次调用,使用默认参数,就存在问题了
print(f()) # ['aaa', 'aaa']
print(f()) # ['aaa', 'aaa', 'aaa']
#原因解释如下:
#Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。
print(f([4, 5])) # [4, 5, 'aaa']
上述现象可以如下更改:
def f(L=None):
if L is None:
L = []
L.append("aaa")
return L
print(f([1, 2, 3])) # [1, 2, 3, 'aaa']
print(f()) # ['aaa']
print(f()) # ['aaa']
print(f()) # ['aaa']
print(f([4, 5])) # [4, 5, 'aaa']
因此,定义默认参数必须指向不变对象;