惯用的python,管理函数中的默认参数

时间:2013-05-05 16:26:47

标签: python arguments default idiomatic

我经常遇到大多数人在这样的函数或方法中管理默认参数值:

def foo(L=None):
  if L is None:
    L = []

但是我看到其他人做的事情如下:

def foo(L=None):
  L = L or []

我不知道我是否遗漏了一些东西但是,为什么大多数人使用第一种方法而不是第二种?它们是同样的东西吗?似乎第二个更清晰,更短。

3 个答案:

答案 0 :(得分:6)

他们并不平等。 第一种方法检查确切,给定arg LNone。 第二次检查,L是以python方式为真。在python中,如果您在条件中检查列表,则规则如下:

  1. 列表为空,然后为假
  2. 否则为
  3. 那么提到的方法之间的区别是什么?比较这段代码。

    首先:

    def foo(L=None):
        if L is None:
            L = []
        L.append('x')
        return L
    
    >>> my_list = []
    >>> foo(my_list)
    >>> my_list
    ['x']
    

    第二

    def foo(L=None):
        L = L or []
        L.append('x')
        return L
    
    >>> my_list = []
    >>> foo(my_list)
    >>> my_list
    []
    

    所以首先没有创建新列表,它使用了给定的列表。但第二个创造了新的。

答案 1 :(得分:1)

如果参数是false-y值,则两者不等效。这并不常见,因为许多假y值不适合您执行此操作的大多数函数。尽管如此,仍然存在可能的重要情况。例如,如果一个函数应该填充一个字典(如果没有给出,则创建一个新的字典),而有人传递一个空的有序字典,那么后一种方法将错误地返回一个普通的字典。

这不是我一直使用is None版本的主要原因。我更喜欢它,因为它更明确,or返回其操作数之一的事实对我来说并不直观。我喜欢忘记它,只要我能;-)额外的线不是问题,这是相对罕见的。

答案 2 :(得分:0)

也许他们不知道第二个?我倾向于使用第一个。

实际上存在差异。如果你传递任何评估为布尔值false的东西,第二个将让L = []。 0空字符串或其他。如果没有传递L或者传递为None,则第一个只会这样做。