默认参数的调用
带有默认参数的函数,在函数被定义的那一刻就执行了计算,而不是在函数被调用的时候执行计算。
在未指定特定参数的情况下,在函数被定义的那一刻就执行了计算的默认参数将在下一次继续被使用,不会覆盖之前的结果。
例子:
#带有默认参数的函数
def default_data(i,list=[]):
#判断是否为字符型
if isinstance(i,str):
list.append(i)
else:
i=i*10
list.append(i)
return list
test=default_data('apple')
test1=default_data(12,[])
test2=default_data(3)
对于上面的例子,我们预想中的结果可能是:
test = ['apple']
test1 = [120]
test2 = [30]
但是,输出的结果是:
test = ['apple', 30]
test1 = [120]
test2 = ['apple', 30]
原因:
导致和我们预想的不同的原因是,我们会认为,默认参数在每一次调用时会被重新赋值为空列表,但是呢,带有默认参数的函数,是在函数被定义的时候执行一次的,在之后的调用中,只要没有给默认参数赋于新的列表,默认参数不会被执行第二次。
所以在执行test=default_data('apple')后,默认参数列表中就包含了'apple',虽然在第二次调用的时候,给默认参数列表赋于了新的空列表,但并不会影响旧默认参数列表,也就是说旧默认参数列表依然存在,在下次没有给默认参数列表赋新的空列表的时候,依然调用旧默认参数列表。