首页 > 解决方案 > 列出默认参数的最佳方法

问题描述

在本文https://florimond.dev/blog/articles/2018/08/python-mutable-defaults-are-the-source-of-all-evil/中,以下代码发布为 pythonic 解决方案:

def append(element, seq=None):
    if seq is None:
        seq = []
    seq.append(element)
    return seq 

对于列表具有默认参数的问题。对我来说,它看起来并不漂亮,我想知道是否有某种方式可以有一个可变的默认值并且没有 if 语句。就像是:

def append(element, seq=defaultlist([])):
    seq.append(element)
    return seq  

标签: python

解决方案


到目前为止,您得到的评论是正确的。有关这方面的进一步说明,请参阅“Least Astonishment”和 Mutable Default Argument

但是,实际上有一种解决方法可以满足您的需求。我不会说它比第 1 版(每个人都使用)更优雅,而且它还需要在你的函数中添加一行代码:你必须在seq函数内部创建一个副本,所以更新的是这个副本,并且不是“默认” seq

def foo(x, seq=[]): 
    seq = list(seq)
    seq.append(x)
    return seq

然后测试它:

>>> foo(1)
[1]
>>> foo(2)
[2]
>>> foo(3, ['a', None])
['a', None, 3]
>>> foo(4)
[4]

推荐阅读