在定义函数时,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