最近有小伙伴在面试中遇到了“关于函数默认参数的坑”的题目,少数伙伴对此问题理得不是太清楚,今天汇智妹请到汇智动力高级教师邓老师为大家详细讲解一下,帮助不太清楚的小伙伴清晰的梳理一遍。邓老师本次主要从以下三点来讲解:

  • 什么是默认参数?
  • 函数默认参数的坑是什么?
  • 函数默认参数为什么会有坑?

一、什么是默认参数

python为了简化函数的调用,提供了默认参数机制,举个例:

 

这样在调用函数时,就可以不写省略的参数。

在定义有默认参数的函数时,需要注意以下两个方面:

 

1.必选参数必须在前面,默认参数在后;

2.设置何种参数为默认参数?一般来说,将参数值变化小的设置为默认参数。

 

二、函数默认参数的坑是什么?

当默认参数使用List时就是个坑,引用一个例子如下:

预期返回的结果应该是:

[0,1]

[0,1,2]

 

然而实际结果是:

 

三、函数默认参数为什么会有坑?

 

要弄清函数默认参数为什么会有坑,需要知道参数可变与不可变的区别。当默认参数指向可变类型对象和不可变类型对象时,会表现出不同的行为。

可变默认参数的表现同上个示例,不可变默认参数的变化情况,看以下示例:

 

输出的结果是:

 

由此结果可以看出,第二次调用时默认参数b不会受第一次调用的影响,因为在函数里面进行计算后,b实际是指向了另外一个对象。而函数使用默认参数时,b指向的还是定义函数时,为b分配的内存地址,这个地址的值是没有改变的。

也就是说,在定义函数默认参数时,解释器会为其参数分配一个地址,且不管是第几次调用,默认值的地址都不会改变,当b的默认值为列表时,b的id就已经定了,后面再用到此默认值,就会使用改变后的结果。