1. 什么是默认参数
在函数定义时,我们可以给某个或某些参数指定默认值,在函数被调用时,如果这个参数没有被传入,则会使用默认值。这就是默认参数。
2. 默认参数的定义方法
在函数中定义默认参数非常简单,我们可以在参数列表中指定默认值即可,如下:
def func(para1, para2=default_value):
pass
在上面的例子中,参数para1没有默认值,而para2有默认值,即default_value。
3. 注意事项
3.1 默认参数必须放在参数列表的最后
在定义函数时,如果有多个参数,我们必须将有默认值的参数放在参数列表的最后。
重要的是要注意,这个限制使得参数名称成为了函数的一部分。 如果你在两个函数都有像下面 description 参数,那么值将会被共享:
def some_function(value, group=[]):
group.append(value)
print(group)
some_function(1)
some_function(2)
some_function(3)
由于函数值被共享,上述代码的输出将会是:
[1]
[1, 2]
[1, 2, 3]
如果你不想要默认值在所有实例间共享, 你可以写下面的代码:
def some_function(value, group=None):
if group is None:
group = []
group.append(value)
print(group)
some_function(1)
some_function(2)
some_function(3)
输出将会是这样的:
[1]
[2]
[3]
3.2 默认参数的值时刻都是一样的
在Python中,函数的默认参数是在函数定义的时候计算的,而不是在运行时计算的。因此,默认参数的值只会在定义时计算一次,这意味着每次调用函数时,使用的都是同一个默认参数值对象。
下面的例子能够很好地说明这一点:
def func(para=[], val=1):
para.append(val)
return para
print(func())
print(func())
print(func())
输出将会是这样的:
[1]
[1, 1]
[1, 1, 1]
我们可以看到,函数默认参数的值每次都在原有的默认参数值的基础上追加了一个元素1,这是因为默认参数的值只在函数定义时计算一次,所以追加的都是同一个默认参数值对象。
正确的方法:
def func(para=None, val=1):
if para is None:
para = []
para.append(val)
return para
print(func())
print(func())
print(func())
输出将会是这样的:
[1]
[1]
[1]
由于每次调用函数时,都会创建一个新的空列表对象,所以每个函数调用的默认参数值都是不同的。因此,当你想要定义默认参数时,一定要使用不可变的对象作为默认参数的值,比如None,而不是用可变对象,比如列表、集合、字典等。
4. 实例演示
下面是一个实例,演示了如何定义和调用一个带有默认参数的函数:
def greet(name, greeting='Hello, '):
print(greeting + name)
greet('Bob')
greet('Alice', 'Hi, ')
输出将会是这样的:
Hello, Bob
Hi, Alice
我们可以看到,当我们不传入第二个参数时,函数将使用默认值,否则,函数将使用我们传入的值。