3

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

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

但是我看到其他人在做类似的事情:

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

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

4

3 回答 3

6

他们不相等。第一种方法精确检查,给定的 argLNone. 第二次检查,L 在 python 方式中是真的。在python中,如果你检查条件列表,规则如下:

  1. 列表为空,则为 False
  2. 否则为真

那么上述方法之间有什么区别?比较这段代码。

第一的:

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
[]

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

于 2013-05-05T16:39:07.940 回答
1

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

is None不过,这不是我始终使用该版本的主要原因。我更喜欢它,因为它更明确,而且or返回其中一个操作数的事实对我来说并不直观。我喜欢尽可能地忘记它;-) 多余的行不是问题,这种情况比较少见。

于 2013-05-05T16:38:10.937 回答
0

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

其实还是有区别的。如果您传递任何评估为布尔假的东西,第二个将让 L = [] 。0 空字符串或其他。第一个只会在没有 L 被传递或它被传递为 None 的情况下这样做。

于 2013-05-05T16:36:50.710 回答