在定义函数时,Python 支持默认值参数,在定义函数时可以为形参设置默认值。
在调用带有默认值参数的函数时,可以不用为设置了默认值的形参进行传递,此时函数将会直接使用函数定义时设置的默认值,当然也可以通过显式赋值来替换其默认值。也就是说,在调用函数时是否为默认值参数传递实参是可选的,具有较大的灵活性,在一定程度上类似于函数重载的功能。
在定义带有默认值参数的函数时,任何一个默认值参数右边都不能再出现没有默认值的普通位置参数,否则会提示语法错误。
① 可以使用 “函数名. _ _ default _ _ ” 随时查看函数所有默认值参数的当前值,其返回值为一个元组,其中的元素依次表示每个默认值参数的当前值。
def say(message, times=1):
print((message + ' ') * times)
print(say.__defaults__)
say('hello')
say('hello', 3)
② 多次调用函数并且不为默认值参数传递值时,默认值参数只在定义时进行一次解释和初始化。 对于列表、字典这样可变类型的默认值参数,这一点可能会导致很严重的逻辑错误,而这种错误或许会耗费大量精力来定位和纠正。
def func(v, s=[]):
s.append(v)
return s
print(func('5', [1, 2, 3, 4]))
print(func('c', ['a', 'b']))
print(func('a'))
print(func('b')) # 注意这里的输出结果
使用列表作为默认参数,由于其可记忆性,连续多次调用该函数而不给该参数传值时,再次调用将保留上一次调用的结果。一般来说,要避免使用列表、字典、集合或其他可变序列作为函数参数默认值。
def func(v, s=None):
if s is None:
s = []
s.append(v)
return s
print(func('5', [1, 2, 3, 4]))
print(func('c', ['a', 'b']))
print(func('a'))
print(func('b')) # 注意这里的输出结果
③ 如果在定义函数时某个参数的默认值为另一个变量值,那么参数的默认值只依赖于函数定义时该变量的值,或者说函数的默认值参数是在函数定义时确定值的,所以只会被初始化依次。
i = 3
def func(n=i): # 参数n的值取决于i的当前值
print(n)
func()
i = 5
func()
i = 7
func()
def func(n=i): # 重新定义函数
print(n)
func()