在工作的slack討論中遇到一個有趣的問題.
一個同事提交的代碼中有一行是這樣
def copy_file(self, source, dest, flags=[]):
...
另一個同事在pr中對這一句提出建議, 不該使用[]. 因為這樣會導(dǎo)致great memory consumption. 后來提交代碼的同事也同意這句話有問題, 從而改為flag=None
并在之后的代碼中修改為:
def copy_file(self, source, dest, flags=None):
...
result = self.run_cmd(... extra_args=(flags or []))
我對這個錯誤充滿了好奇, 畢竟剛學(xué)Python不久. 于是就在網(wǎng)上查了一下資料. 找到在stackoverflow中的答案: link1, link2.
這個問題似乎還挺有學(xué)問, 是不少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似乎并不是這個問題最主要的實質(zhì). 所以我用這篇文章, 記錄下對這個問題的探索.