在定义函数时,Python支持默认值参数,在定义函数时可以为形参设置默认值。在调用带有默认值参数的函数时,可以不用为设置了默认值的形参进行传值,此时函数将会直接使用函数定义时设置的默认值,当然也可以通过显式赋值来替换其默认值。也就是说,在调用函数时是否为默认值参数传递实参是可选的,具有较大的灵活性。例如:
>>> def say( message, times =1 ):
print((message+' ') * times)
>>> say('hello')
hello
>>> say('hello', 3)
hello hello hello
好了,下面重点介绍默认值参数的坑,虽然说是两个坑,但实际上是一个意思。
(1)默认值参数的值是在函数定义时确定的
>>> i = 3
>>> def f(n=i): #参数n的值仅取决于i的当前值
print(n)
>>> f()
3
>>> i = 5 #函数定义后修改i的值不影响参数n的默认值
>>> f()
3
>>> i = 7
>>> f()
3
>>> def f(n=i): #重新定义函数
print(n)
>>> f()
7
(2)默认值参数只初始化一次
如果参数的默认值是数字、字符串、元组或其他不可变类型的数据,并不会有什么影响,但是如果参数的默认值是列表、字典、集合等可变类型数据的话,这里有个大坑。
>>> def demo(newitem, old_list=[]):
old_list.append(newitem)
return old_list
>>> print(demo('5', [1, 2, 3, 4]))
[1, 2, 3, 4, '5']
>>> print(demo('aaa', ['a', 'b']))
['a', 'b', 'aaa']
>>> print(demo('a'))
['a']
>>> print(demo('b')) #注意这里的输出结果
['a', 'b']
如果想得到正确结果,建议把函数写成下面的样子:
def demo(newitem, old_list=None):
if old_list is None:
old_list = []
old_list.append(newitem)
return old_list