在工作的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似乎并不是这个问题最主要的实质. 所以我用这篇文章, 记录下对这个问题的探索.
网友评论