简单的Coder

Code is my life, that's it.

为什么Python函数定义中关键字参数不推荐设置mutable的默认值?

很多关于Python的Best Practice中都会提到,在函数定义的时候,关键词参数的默认值不要设置成mutable的类型,比如list, dict。那么具体原因是什么呢?之前一直没有去思考,直到膝盖中了一箭。 先看下面的例子:

1
2
3
def example(items=[]):
    items.append("test")
    return items

调用example()会返回什么呢?第二次,第三次调用又会返回什么呢?

1
2
3
4
5
6
7
8
>>> example()
['test']

>>> example()
['test', 'test']

>>> example()
['test', 'test', 'test']

是不是觉得结果有些意外?是的,这就是Python函数的定义机制:

在生命周期中,函数的声明语句只会执行一次,就是在源码被解释器解释的时候,而不是在被调用的时候。

Comments