Python中函数的默认参数
Python中的函数可以设置默认参数,这使得在使用函数时,可以让用户不必输入每一个参数值,只需输入必要的参数即可。默认参数可以在函数定义时,在参数列表中给出,以此作为默认值。当调用函数时,如果没有给出该参数值,则使用默认值。下面介绍Python中函数默认参数的用法。
一、定义默认参数
在定义函数时,如果想要给某个参数赋默认值,可以在参数列表中指定该参数的默认值。
例如:
def func(a, b=10, c=20):
print("a=", a, "b=", b, "c=", c)
func(1) # a=1 b=10 c=20
func(1, 2) # a=1 b=2 c=20
func(1, 2, 3) # a=1 b=2 c=3
上述代码中,函数func定义了三个参数,其中b和c都有默认值,即b=10,c=20。调用函数func时可以不输入参数b和c的值,程序会使用默认值。同时,也可以修改某个参数的值,例如func(1,2,3)即将参数b和c的值分别设置为2和3。
二、默认参数的注意事项
在使用默认参数时,应该注意以下几点:
1. 默认参数放在参数列表最后。
在定义函数时,默认参数必须放在参数列表的最后,这意味着在调用函数时,默认参数之后的参数必须被输入。例如:
def func(a=10, b):
pass # 该行会报错
def func(b, a=10):
pass # ok
如果将默认参数放在参数列表的前面,会报“non-default argument follows default argument”的错。
2. 默认参数的值在函数定义时就已经被确定了。
在函数定义时,Python会将默认参数的值计算并存储在内存中,调用函数时这些值将会作为常量使用。这就意味着,在下列代码中,只有第一次调用时将使用p的默认值,后面的调用都输出第一次赋的值。
def func(a, p=[]):
p.append(a)
print(p)
func(1) # [1]
func(2) # [1,2]
func(3) # [1,2,3]
在上述例子中,虽然每次调用函数时参数p只输入了一个数值,但输出列表p却是由多个数值组成的。这是因为p在函数定义时已被创建并存储在内存中,在后续调用中改用的还是原来的p,并在其中添加新的值。如果不希望这种情况出现,可以使用下列方法避免:
def func(a, p = None):
if p is None:
p = []
p.append(a)
print(p)
func(1) # [1]
func(2) # [2]
func(3) # [3]
在这种情况下,即使列表p在函数定义时被创建,也因为每次调用时进行判断而被正确使用。
3. 参数名必须一致。
默认参数在函数调用时的名字必须与它在函数定义时一致,而不是参数的位置。也就是说,在下列代码块中,a与x相同,b与y相同,c与z相同。
def func(a, b, c=10):
pass
func(x=1, y=2, z=3)
4. 可变对象作为默认值。
默认参数可以是任意可变对象,如列表、集合或字典。如果将可变对象作为默认参数值,则可以在函数中修改该对象,该对象将会在每次调用函数时保持其状态。
例如:
def func(list1=[]):
list1.append(1)
print(list1)
func() # [1]
func() # [1,1]
func() # [1,1,1]
在该例中,可变对象list1被定义为默认参数,在每次调用函数时都会保持其状态。
三、总结
默认参数使得调用函数更加便利,同时也需要注意在使用时的细节问题,防止出现程序错误。需要注意的是,默认参数的值在函数定义时即被确定,调用函数时该值作为常量使用,可变对象作为默认参数的值将会在每次调用函数时保持其状态,因此使用时应该结合对内存机制的理解。
