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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 个人笔记,方便自己查阅使用 Py.LangSpec.Contents Refs Built-in Closure ...
    freenik阅读 67,816评论 0 5
  • Python一些有趣且鲜为人知的特性 Python, 是一个设计优美的解释型高级语言, 它提供了很多能让程序员感到...
    羋学僧阅读 3,468评论 0 2
  • 夜莺2517阅读 127,784评论 1 9
  • 版本:ios 1.2.1 亮点: 1.app角标可以实时更新天气温度或选择空气质量,建议处女座就不要选了,不然老想...
    我就是沉沉阅读 11,829评论 1 6
  • 我是一名过去式的高三狗,很可悲,在这三年里我没有恋爱,看着同龄的小伙伴们一对儿一对儿的,我的心不好受。怎么说呢,高...
    小娘纸阅读 8,683评论 4 7