Python default parameter set as []

在工作的slack讨论中遇到一个有趣的问题.

一个同事提交的代码中有一行是这样

def copy_file(self, source, dest, flags=[]):
    ...

另一个同事在pr中对这一句提出建议, 不该使用[]. 因为这样会导致great memory consumption. 后来提交代码的同事也同意这句话有问题, 从而改为flag=None并在之后的代码中修改为:

def copy_file(self, source, dest, flags=None):
...
result = self.run_cmd(... extra_args=(flags or []))

我对这个错误充满了好奇, 毕竟刚学Python不久. 于是就在网上查了一下资料. 找到在stackoverflow中的答案: link1, link2.

这个问题似乎还挺有学问, 是不少new pythoner容易犯的错误. 主要就是在使用default parameter时使用了mutable object, 比如list/dict. 而讲解得最细致的, 是这篇文章: Default Parameter Values in Python. 这个问题充分展示了funtion作为first class member在Python中的特性. 所以确实是个好问题.

刚刚的文章中用到的非常好的例子:

>>> def function(data=[]):
...     data.append(1)
...     return data
...
>>> function()
[1]
>>> function()
[1, 1]
>>> function()
[1, 1, 1]

另外def作为一个executable statement的特点也值得记住.

不过回过头来, 我的同事们提到的memory issue似乎并不是这个问题最主要的实质. 所以我用这篇文章, 记录下对这个问题的探索.

你可能感兴趣的:(Python default parameter set as [])